常用类2
常用类2
日期时间api的使用.
一、JDK8之前的API:
-
System类的currentTimeMillis(
- 获取当前时间对应的毫秒数,long类型,时间戳
- 当前时间与1970年1月1日0时0分0秒之间的毫秒数
- 常用来计算时间差
package com.xin.cylei.demo02;
/*
Date类的使用
/--java.util.Date
>两个构造器的使用
>两个方法的使用:①toString() 2long getTime()
l ----java.sql.Date:对应着数据库中的date类型
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Day83101 {
public static void main(String[] args) {
Day83101 da = new Day83101();
// da.test1();
// da.test2();
da.test4();
}
public void test1(){
Date date1=new Date();//创建一个基于当前系统时间的Date的实例
System.out.println(date1.toString());//Thu Aug 31 14:34:02 CST 2023
long time = date1.getTime();
System.out.println("对应的毫秒数为:"+time);//1693463642785
Date date2 = new Date(1193463503047l);//创建一个基于指定时间戳的Date的实例
System.out.println(date2.toString());//Sat Oct 27 13:38:23 CST 2007
}
public void test2(){
java.sql.Date date3=new java.sql.Date(1393463503047l);
System.out.println(date3.toString());//2014-02-27
System.out.println(date3.getTime());//1393463503047
}
/*
SimpleDateFormat类:用于日期时间的格式化和解析
格式化:日期--->字符串
解析:字符串--->日期
*/
public void test3(){
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化:日期--->字符串
Date date = new Date();
String format = sdf.format(date);
System.out.println(format);//23-8-31 下午2:46
// 解析:字符串--->日期
Date date1 = null;
try {
date1 = sdf.parse("23-8-31 下午8:46");
} catch (ParseException e) {
throw new RuntimeException(e);
}
System.out.println(date1);
}
public void test4(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化:日期--->字符串
Date date = new Date();
String format = sdf.format(date);
System.out.println(format);//2023-08-31 02:54:14
}
}
/*
calendar:日历类
实例化由于Calendar是一个抽象类,所以我们需要创建其子类的实例。这里我们通过Calendar的静态方法
getInstance()即可获取
*/
public void test5(){
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass());//class java.util.GregorianCalendar
//测试方法
//get(int field)
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//31
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//5
//set(int field,xx)
calendar.set(Calendar.DAY_OF_MONTH,23);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//23
//add(int field,xx)
calendar.add(Calendar.DAY_OF_MONTH,3);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//26
//gettime
Date time = calendar.getTime();
System.out.println(time);//Sat Aug 26 15:12:07 CST 2023
//setTime()∶使用指定Date重置Calendar
Date date = new Date();
calendar.setTime(date);
System.out.println(calendar.getTime());//Thu Aug 31 15:14:51 CST 2023
}
/*
拓展:
将控制台获取的年月日(比如: 2022-12-13)的字符串数据,保存在数据库中。
(简化为得到java.sql.Date的对象,此对象对应的时间为2022-12-13) .*
*字符串---> java.util.Date ---> java.sql.Date
*/
public void test6() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String pattern="2022-12-13";
//得到java.util.Date
Date date = null;
try {
date = sdf.parse(pattern);
} catch (ParseException e) {
throw new RuntimeException(e);
}
//转换为java.sql.Date
java.sql.Date date1 = new java.sql.Date(date.getTime());
System.out.println(date1);//2022-12-13
}
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性: Date中的年份是从1900开始的,而月份都从0开始。
- 格式化:格式化只对Date有用,Calendar则不行。
- 此外,它们也不是线程安全的;不能处理闰秒等。
JDK8:新的日期时间API
4.1本地日期时间:LocalDate、LocalTime、LocalDateTime
二、JDK8中的API:
- LocalDate ,LocalTime ,LocalDateTime --->类似于Calendar
- 实例化:now() / of(xxx ,xx ,xX)
- 方法: get() / withXxx() l plusxxx() l minusXxx() ...
private void test1() {
//now()∶获取当前日期和时间对应的实例
LocalDate localDate=LocalDate.now();
LocalTime localTime=LocalTime.now();
LocalDateTime localDateTime=LocalDateTime.now();
System.out.println(localDate);//2023-08-31
System.out.println(localTime);//15:44:24.449
System.out.println(localDateTime);//2023-08-31T15:44:24.449
//of():
LocalDate d1 = LocalDate.of(2021, 5, 6);
LocalDateTime d2 = LocalDateTime.of(2021, 5, 6, 11, 11, 11);
System.out.println(d1);
System.out.println(d2);//2021-05-06T11:11:11
//getxxx()
LocalDateTime localDateTime1=LocalDateTime.now();
System.out.println(localDateTime1.getDayOfMonth());
//体现不可变性
// withXxx ()
LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(15);
System.out.println(localDateTime1);
System.out.println(localDateTime2);
LocalDateTime localDateTime3 = localDateTime1.plusDays(5);
System.out.println(localDateTime1);//2023-08-31T15:55:11.501
System.out.println(localDateTime3);//2023-09-05T15:55:11.501
}
4.2瞬时:Instant
- Instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳。
- 时间戳是指格林威治时间1970年o1月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
private void test2() {
//now()
Instant instant=Instant.now();//伦敦时间
System.out.println(instant);//2023-08-31T08:03:53.333Z
Instant instant1 = Instant.ofEpochMilli(1654135416l);
System.out.println(instant1);//1970-01-20T03:28:55.416Z
}
- Instant:瞬时--->类似于Date
- 实例化: now() / ofEpochMilli
- 方法: toEpochMilli()
//JDK8的api: DateTimeFormatter
private void test3() {
//自定义的格式。如: ofPattern( "yyyy-MM-dd hh : mm : ss")
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh : mm : ss");
//格式化:日期、时间-->字符串
LocalDateTime localDateTime=LocalDateTime.now();
String format = dateTimeFormatter.format(localDateTime);
System.out.println(format);//2023-08-31 04 : 14 : 24
//解析:字符串--->日期、时间
// TemporalAccessor parse = dateTimeFormatter.parse("2023-08-31 04 : 14 : 24");
// LocalDateTime from = LocalDateTime.from(parse);
// System.out.println(from);
}
---
5.Java比较器
1.实现对象的排序,可以考虑两种方法:自然排序、定制排序
2.方式一:实现Comparable接口的方式
实现步骤:
- 具体的类A实现Comparable接口
- 重写Comparable接口中的compareTo(0bject obj)方法,在此方法中指明比较类A的对象的大小的标准
- 创建类A的多个实例,进行大小的比较或排序。
package com.xin.cylei.demo02;
public class Product implements Comparable{
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
/**
* 当前的类需要实现Comparable中的抽象方法: compareTo(0bject o)
* 在此方法中,指明如何判断当前类的对象的大小。比如:按照价格的高低进行大小的比较。(或从低到高排序)
* 如果返回值是正数:当前对象大。如果返回值是负数:当前对象小。如果返回值是0,一样大。
* @param o the object to be compared.
* @return
*/
@Override
public int compareTo(Object o) {
if (o==this){
return 0;
}
if (o instanceof Product){
Product p=(Product) o;
return Double.compare(this.price,p.price);
}
//手动抛出一个异常类的对象
throw new RuntimeException("类型不匹配");
}
}
=====
package com.xin.cylei.demo02;
import java.util.Arrays;
/*
*/
public class Day83103 {
public static void main(String[] args) {
Day83103 da = new Day83103();
da.test2();
}
public void test1(){
String[] arr= new String[]{"xiaomi","Tom","Jerry","Tony","Jeck"};
Arrays.sort(arr);
//排序后,遍历
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public void test2(){
Product[] arr=new Product[5];
arr[0]=new Product("dht",4521);
arr[1]=new Product("stvvs",5634);
arr[2]=new Product("dgtre",7854);
arr[3]=new Product("xded",1587);
arr[4]=new Product("aaa",2456);
Arrays.sort(arr);
//排序后,遍历
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
3.方式二:实现Comparato接口的方式
实现步骤:
- 创建一个实现了Comparator接口的实现类A
- 实现类A要求重写Comparator接口中的抽象方法compare(0bject o1,0bject o2),在此方法中指明要比较大小的对象的大小关系。(比如,String类、Product类)
- 创建此实现类A的对象,并将此对象传入到相关方法的参数位置即可。(比如:Arrays.sort(..,类A的实例))
public void test3(){
Product[] arr1=new Product[5];
arr1[0]=new Product("dht",4521);
arr1[1]=new Product("stvvs",5634);
arr1[2]=new Product("dgtre",7854);
arr1[3]=new Product("xded",1587);
arr1[4]=new Product("aaa",2456);
//创建一个实现了Comparator接口的实现类的对象
Comparator comparator=new Comparator() {
//如果判断两个对象o1,o2的大小,其标准就是此方法的方法体要编写的逻辑。
//比如:按照价格从高到低排序
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Product && o2 instanceof Product){
Product p1=(Product) o1;
Product p2=(Product) o2;
return -Double.compare(p1.getPrice(),p2.getPrice());
}
throw new RuntimeException("类型不匹配");
}
};
Arrays.sort(arr1,comparator);
//排序后,遍历
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
}
4.对比两种方式:
- 角度一:
自然排序:单一的,唯一的定制排序:灵活的,多样的 - 角度二:
自然排序:一劳永逸的定制排序:临时的 - 角度三:细节
自然排序:对应的接口是Comparable,对应的抽象方法compareTo(Object obj)
定制排序:对应的接口是Comparator,对应的抽象方法compare(Object obj1,0bject obj2)
-
system类
属性: out、 in、 err
方法: currentTimeMillis() / gc() / exit(int status) / getProperty(String property)
-
Runtime类
对应着Java进程的内存使用的运行时环境,是单例的
-
Math类
凡是与数学运算相关的操作,大家可以在此类中找相关的方法即可
-
BigInteger类和BigDecimal类
BigInteger:可以表示任意长度的整数
BigDecimal:可以表示任意精度的浮点数
-
Random类
获取指定范围的随机整数:nextInt(int bound)
复习
1.String类
-
String的声明: final修饰、实现了Comparable接口.
-
String的不可变性
-
String的两种定义方式:字面量的定义方式 string s = "hello" 2.new的方式:
-
- String s = new String("hello");oString的内存解析:字符串常量池、堆内存的使用
- String s = new String("hello");在内存中创建的对象的个数。
-
String的连接操作:+
-
常量+常量、变量+常量、变量+变量、concat(String otherString)o
-
String intern()
-
熟悉String的构造器、与其他结构之间的转换、常用方法
- 编码和解码
- 编码:字符、字符串-->字节、字节数组。对应着编码集
- 解码:字节、字节数组-->字符、字符串。对应着解码集
- 规则:解码集必须使用当初编码时使用的编码集。只要不一致,就可能出现乱码!
- 编码和解码
-
string相关的算法问题。
2.StringBuffer、StringBuilder类
- [面试题]string、StringBuffer、StringBuilder的区别
- 知道什么场景下使用stringBuffer、StringBuilder
3.jdk8之前的日期、时间API
- System的currentTimeMillis()
- 两个Date的使用
- simpleDateFormat用于格式化、解析
- Calendar日历类的使用
4.jdk8中新的日期、时间API
- LocalDate、LocalTime、LocalDateTime -->类似于calendaro
- lnstant -->类似于Date
- DateTimeFormatter --->类似于simpleDateFormat
5.比较器(重点)
- 自然排序涉及到comparable
- compareTo(Object obj)
- 定制排序涉及到comparator
- compare(Object obj1,Object obj2)
面试题
-
String中“+”怎样实现? (阿*)
- 常量+常量:略
- 变量+常量、变量+变量:创建一个StringBuilder的实例, 通过append(添加字符串,最后调用toString()返回1个字符串。(toString()内部new -个String的实例)
9.subString()到底做了什么?(银*数据)
String str = "hello";
String subStr = str.subString(1,3);//底层是new的方式返回一个subStr,实体内容是"el"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?