学习10[常用类]

JDK8之前的日期时间API测试

1.System类中的currentTimeMillis()
2.java.util.Date类和java.util.Date
3.SimpleDateFormat
4.Calendar
  1. System类中的currentTimeMillis()

用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差

称为时间戳

此方法适于计算时间差

long time = System.currentTimeMillis();
System.out.println(time);//1633966657021

 

  • Date类两个构造器的使用:

  1. java.util.Date类

  • 构造器一:Date();

    创建一个对应当前时间的Date对象

Date date1 = new Date();
System.out.println(date1.toString());
//Mon Oct 11 23:50:11 CST 2021
  • 构造器二:创建指定毫秒数的Date对象

    1633967701698L

Date date2 = new Date(1633967701698l);
System.out.println(date2.toString());
//Mon Oct 11 23:55:01 CST 2021

还有它的子类:java.sql.Date类

 

两个方法的使用

  • toString():显示当前的年月日时分秒

  • getTime():获取当前Date对象的毫秒数(时间戳)

System.out.println(date1.getTime());//1633967701698

 

  1. 子类java.sql.Date对应着数据库中的日期类型的变量

如何实例化:创建java.sql.Date对象

java.sql.Date date3 = new java.sql.Date(345678368494L);
System.out.println(date3);
//1980-12-15只打印年月日

 

  • sql.Date----->util.Date对象:多态

  • util.Date----->sql.Date对象p470

情况一:强转√

Date date4=new java.sql.Date(5678976534567L);
java.sql.Date date5=(java.sql.Date)date4;

情况二:

Date date6=new Date();
java.sql.Date date7=new java.sql.Date(date6.getTime());
//用getTime()方法找到time,把毫秒数扔到构造器里作为参数
  1. SimpleDateFormat:

    SimpleDateFormat的实例化

    //SimpleDateFormat的实例化
    SimpleDateFormat sdf = new SimpleDateFormat();

    对日期Date类的格式化和解析

    两个操作:

    • 格式化:日期--->字符串

    format()

    1634403754902

    • 解析:格式化的逆过程,字符串--->日期

      parse()

      使用默认的构造器时:

      格式固定:21-10-17 上午1:10,

      解析固定:Sat Dec 17 01:00:00 CST 2011

    1634404274443

    使用带参构造器时:

    按照指定的方式格式化和解析构造器

    1634405667460

练习一:

字符串“2020-09-08”转换为java.sql.Date

String birth="2020-09-08";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf1.parse(birth);//util下的Date
java.sql.Date date=new java.sql.Date(date1.getTime());
System.out.println(date);//sql下的Date

练习二:

三天打鱼两天晒网 1990-01-01

2020-09-08打渔?晒网?

方式一:

(date2.getTime()-date2.getTime())/(1000*60 *60 *24)+1

方式二:

总天数%5==1,2,3:打渔

总天数%5==4,0:晒网

总天数的计算:

1990-01-01---->2019-12-31+

2020-01-01----->2020-09-08

  1. Calendar日历类(抽象类)的使用

一、实例化

方式一:创建其子类(GregorianCalendar)的对象

方式二:调用其静态方法getInstance()

Calendar calendar = Calendar.getInstance();

两个方法是一样的:

System.out.println(calendar.getClass());
//对象是哪个类造的:class java.util.GregorianCalendar

二、常用方法

  • get()

    当前时间是这个月的第几天:

int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//17
  • set()

    返回值为void:改本身

calendar.set(Calendar.DAY_OF_MONTH,2);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//2
  • add():

    返回值为void:改本身

calendar.add(Calendar.DAY_OF_MONTH,3);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//5
  • getTime()

    日历类---->Date

Date date2 = calendar.getTime();
System.out.println(date2);
//Tue Oct 05 17:52:03 CST 2021
  • setTime()

    Date---->日历类

Date date3 = new Date();
calendar.setTime(date3);
days=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//17

注意:

获取月份时:

一月是0,二月是1……

获取星期时:

周日是1,周一是2

 

习题

1634027758782

1634028846075

  • 部分反转

1634039160490

  • 查找字符串出现几次

1634139559917

1634139836306

  • 寻找最大的相同子字符串

1634228674333

  • 存在多个长度相同的最大子字符串

此时先返回String[ ],后面可以用集合中的ArrayList替换

1634315742302

1634315836213

输出:[hello,kabcd]

  • 程序输出

1634401380829

IDEA中Debug

 

JDK8中新日期时间API

以前面临的问题:

可变性:

像日期和时间这样的类应该是不可变的

偏移性:

Date date = new Date(2020-1900, 9-1, 8);
System.out.println(date);

格式化:

格式化只对Date有用,Calendar则不行

不是线程安全的,不能处理闰秒

LocalDate、LocalTime、LocalDateTime的使用

说明 :

  1. LocalDateTime的使用频率高

一、实例化

  • now()

    获取当前的日期、时间、日期和时间

LocalDate localDate = LocalDate.now();

LocalTime localTime = LocalTime.now();

LocalDateTime localDateTime = LocalDateTime.now();

System.out.println(localDate);//2021-10-18
System.out.println(localTime);//10:11:35.725
System.out.println(localDateTime);//2021-10-18T10:11:35.725
  • of()

    设置指定的年月日时分秒,没有偏移量

LocalDateTime localDateTime1 = LocalDateTime.of(2020, 6, 12, 3, 5, 4);
System.out.println(localDateTime1);//2020-06-12T03:05:04

二、方法

  • getXxx():获取相关属性

    没有偏移值

System.out.println(localDate.getDayOfWeek());//MONDAY
  • withXxx():设置相关属性

    体现不可变性

LocalDate localDate1 = localDate.withDayOfMonth(23);
System.out.println(localDate);//2021-10-18
System.out.println(localDate1);//2021-10-23
  • plusXxx():加

LocalDateTime localDateTime2 = localDateTime.plusMonths(4);

System.out.println(localDateTime);//2021-10-18T10:38:48.102
System.out.println(localDateTime2);//2022-02-18T10:38:48.102
  • minusXxx():减

 

instant的使用

类似java.util.Date类

一、实例化

  • now():获取本初子午线对应的标准时间

Instant instant = Instant.now();
System.out.println(instant);
//2021-10-18T02:57:19.525Z

有8个小时时间差

添加时间的偏移量:

OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2021-10-18T11:01:11.190+08:00

1634526148619

(instant小写)

  • ofEpochMilli()

    通过给定的毫秒数,获取Instant实例

Instant instant1 = Instant.ofEpochMilli(1634526344321l);
System.out.println(instant1);//2021-10-18T03:05:44.321Z

二、方法

  • toEpochMilli()

    获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数

    类似Date类的getTime()

long milli = instant.toEpochMilli();
System.out.println(milli);//1634526344321

 

DateTimeFormatter类

用来格式化或解析日期、时间

类似SimpleDateFormat

一、预定义的标准格式

DateTimeFormatter formatter=DateTimeFormatter.ISO_DATE_TIME;

  • 格式化:日期---->字符串

    format();

LocalDateTime localDateTime = LocalDateTime.now();
String str = formatter.format(localDateTime);

System.out.println(localDateTime);//2021-10-18T11:26:22.153
System.out.println(str);
//2021-10-18T11:26:22.153
  • 解析:字符串---->日期

    parse();

TemporalAccessor parse = formatter.parse("2021-10-18T11:26:22.153");
System.out.println(parse);
//{},ISO resolved to 2021-10-18T11:26:22.153

 

二、本地化相关的格式

  1. ofLocalizedDate();

FormatStyle.FULL/FormatStyle.LONG/

FormatStyle.MEDIUM/FormatStyle.SHORT:

适用于LocalDate

LocalDateTime localDateTime = LocalDateTime.now();DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
  • 格式化

String str=dateTimeFormatter.format(localDateTime);
System.out.println(str);//2021年10月18日

格式不同:

1634528863435

  • 解析

  1. ofLocalizedDateTime();

FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT:

适用于LocalDateTime

 

三、自定义的格式(重点)

ofPatter("yyyy-MM-dd hh:mm:ss E")

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh-mm-ss");
  • 格式化

String str = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(str);//2021-10-18 11-57-53
  • 解析

TemporalAccessor accessor = dateTimeFormatter.parse("2021-10-18 11-57-53");
System.out.println(accessor);//{SecondOfMinute=53, MinuteOfHour=57, MicroOfSecond=0, MilliOfSecond=0, NanoOfSecond=0, HourOfAmPm=11},ISO resolved to 2021-10-18

 

Java比较器

一、说明:

Java中的对象,正常情况下,只能进行比较==或!=,不能使用<,>的

但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小

如何实现?

使用两个接口中的任何一个:Comparable、Comparator

二、Comparable接口的使用

Comparable接口的使用举例:自然排序

  1. 像String、包装类等实现了Comparable接口,重写了ComparableTo(obj)方法,给出了比较两个对象大小的方式

  2. 像String、包装类重写了comparableTo(obj)方法,进行从小到大的排列

//Comparable接口的使用举例
String arr[]=new String[]{"AA","DD","RR","EE","FF"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
  1. 重写comparableTo(obj)的规则:

如果当前对象this大于形参对象obj,则返回正整数,

如果当前对象this小于形参对象obj,则返回负数

如果当前对象this小于形参对象obj,则返回零

  1. 对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写comparableTo(obj)方法,在comparableTo(obj)方法中指明如何排序

1634742260191

1634742288919

1634742318310

  1. Comparator接口使用:定制排序

    1. 背景:

      当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序

    2. 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:

      如果方法返回正整数,则表示o1大于o2;返回0,相等;返回负整数,则表示o1小于o2

String arr[]=new String[]{"AA","DD","RR","EE","FF"};Arrays.sort(arr, new Comparator<String>() {    //按照字符串从大到小排列    
   @Override    
   public int compare(String o1, String o2) {        
       if (o1 instanceof String && o2 instanceof String){            String s1=(String) o1;            String s2=(String) o2;            return -s1.compareTo(s2);       }        
       throw new RuntimeException("输入的数据类型不一致");    
  }
});
System.out.println(Arrays.toString(arr));

1634814439356

1634815717662

 

三、Comparable接口与Comparator的使用的对比:

Comparable接口的方式一旦指定,可以保证Comparable接口实现类的对象在任何位置都可以比较大小

Comparator接口属于临时性比较

 

其他常用类的使用

  • native long currentTimeMills()

  • void exit(int status)

  • void gc()

  • String getProperty(String key)

1634920267068

  1. System类

  2. Math类

  3. BigInteger与BigDecimal

 

System类

String javaVersion = System.getProperty("java.version");System.out.println(javaVersion);//1.8.0_281

String javaHome = System.getProperty("java.home");System.out.println(javaHome);//E:\JDK8\jre

String osName = System.getProperty("os.name");System.out.println(osName);//Windows 10

String osVersion = System.getProperty("os.version");System.out.println(osVersion);//10.0

String userName = System.getProperty("user.name");System.out.println(userName);//1111

String userVersion = System.getProperty("user.version");System.out.println(userVersion);//null

String userDir = System.getProperty("user.dir");System.out.println(userDir);//E:\javaSE

1634921133627

 

Math类

1634921244974

 

BigInteger与BigDecimal

integer类作为int的包装类,能存储2^31-1

Long存储2^63-1

BigInteger可以表示不可变的任意精度的整数

1634921454582

BigDecimal对数字要求精度非常高

1634921912701

 

posted @ 2021-10-23 01:02  qwertyuiopxuexi  阅读(66)  评论(0)    收藏  举报