【学习打卡】Java高级(四)

学习目标:

Java 高级编程 学习打卡 第四天

学习内容:

1、将字符串”2017-08-16”转换为对应的java.sql.Date类的对象。(使用JDK8之前或JDK8中的API皆可)

2、解释何为编码?解码? 何为日期时间的格式化?解析?

编码:字符串——>字节
解码:字节——>字符串
格式化:日期——>字符串
解析:字符串——>日期

3、自定义Person类如下,如何实现自然排序(按姓名从小到大排序),代码说明

4、提供定制排序涉及到的接口的实现类对象,并按Person类的年龄从大到小排序

5、JDK 8之前和JDK8中日期、时间相关的类分别有哪些?

学习时间:

2021年4月28日

学习产出:

【学习打卡】Java高级 第一天
【学习打卡】Java高级 第二天
【学习打卡】Java高级 第三天
【学习打卡】Java高级 第四天

学习总结:

JDK8中新日期时间API

日期时间API的迭代:

第一代:jdk 1.0 Date类

第二代:jdk 1.1 Calendar类,一定程度上替换Date类

第三代:jdk 1.8 提出了新的一套API

前两代存在的问题举例:

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

偏移性:Date中的年份是从1900开始的,而月份都从0开始。

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

此外,它们也不是线程安全的;不能处理闰秒等。

java 8 中新的日期时间API涉及到的包

【学习打卡】Java高级(四)_第1张图片

本地日期、本地时间、本地日期时间的使用:LocalDate / LocalTime / LocalDateTime

1、说明:
① 分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

② LocalDateTime相较于LocalDate、LocalTime,使用频率要高

③ 类似于Calendar

2、常用方法:

【学习打卡】Java高级(四)_第2张图片

时间点:Instant

1、说明:

① 时间线上的一个瞬时点。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC开始的秒数。)

② 类似于 java.util.Date类

2、常用方法:

【学习打卡】Java高级(四)_第3张图片

日期时间格式化类:DateTimeFormatter

1、说明:

① 格式化或解析日期、时间

② 类似于SimpleDateFormat

2、常用方法:

① 实例化方式:

预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

② 常用方法:

【学习打卡】Java高级(四)_第4张图片

特别的:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

//  重点:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String s = formatter.format(LocalDateTime.now());
System.out.println(s);
//2021-05-02 08:49:24

TemporalAccessor accessor = formatter.parse("2021-05-02 08:46:52");
System.out.println(accessor);
/*
	{HourOfAmPm=8, MicroOfSecond=0, SecondOfMinute=52, MilliOfSecond=0, 
	MinuteOfHour=46, NanoOfSecond=0},ISO resolved to 2021-05-02
*/

其它API的使用

1、带时区的日期时间:ZonedDateTime / ZoneId

// ZoneId:类中包含了所的时区信息
//获取所有的ZoneId
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
for (String zoneId : zoneIds) {
     
	System.out.println(zoneId);
}

//获取“America/Toronto”时区对应的时间
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("America/Toronto"));
System.out.println(localDateTime);

//获取本时区的ZonedDateTime对象
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);

//获取“America/Toronto”时区的ZonedDateTime对象
ZonedDateTime time = ZonedDateTime.now(ZoneId.of("America/Toronto"));
System.out.println(time);

3、日期间隔:Period,用于计算两个“日期”间隔,以年、月、日衡量

LocalDate startDate = LocalDate.of(2000, 9, 20);
LocalDate endDate = LocalDate.of(2020, 12, 29);
Period period = Period.between(startDate, endDate);
System.out.println(period);//P20Y3M9D
System.out.println(period.getDays());//9
System.out.println(period.getMonths());//3
System.out.println(period.getYears());//20

4、日期时间校正器:TemporalAdjuster

//获取当前日期的下一个星期天是哪天
TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
System.out.println(localDateTime);

//获取下一个工作日是哪天
LocalDate localDate = LocalDate.now().with(new TemporalAdjuster() {
     
	@Override
	public Temporal adjustInto(Temporal temporal) {
     
		LocalDate date = (LocalDate) temporal;
		if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) {
     
			return date.plusDays(3);
		}else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
     
			return date.plusDays(2);
		}else{
     
			return date.plusDays(1);
		}
    }
});
System.out.println(localDate);	

Java比较器

Java比较器的使用背景:

Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的,但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。使用Comparable 或 Comparator。

自然排序:使用Comparable接口

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

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

3、重写compareTo(obj)的规则:

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

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

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

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

public class Goods implements Comparable {
     

    private String name;
    private double price;

    /**
     *
     * 指明商品比较大小的方式
     * 按照价格从低到高排序
     * 再按照商品名称从高到低排序
     *
     */
    @Override
    public int compareTo(Object o) {
     

        if(o instanceof Goods){
     

            //方式一
            Goods goods = (Goods) o;
            if(this.price> goods.price){
     
                return 1;
            }else if(this.price<goods.price){
     
                return -1;
            }else{
     
                //return 0;
                return this.name.compareTo(goods.name);
            }

            //方式二
            //return Double.compare(this.price,goods.price);

        }
        throw new RuntimeException("传入的数据类型不一致");
    }
}

定制排序:使用Comparator接口

1、背景:

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

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

如果方法返回正整数,则表示o1大于o2;

如果返回0,表示相等;

返回负整数,表示o1小于o2。

public class Book {
     

    private String name;
    private double 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;
    }

    /*
        指明书比较大小的方式
        按照书名从低到高排序
        再按照价格从高到低排序
    */

    Comparator comparator = new Comparator() {
     
        @Override
        public int compare(Object o1, Object o2) {
     
            if (o1 instanceof Book && o2 instanceof Book) {
     
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                if (book1.getName().equals(book2.getName())) {
     
                    return Double.compare(book1.getPrice(), book2.getPrice());
                } else {
     
                    return book1.getName().compareTo(book2.getName());
                }
            }
            throw new RuntimeException("输入的数据类型不一致");
        }
    };
}

两种排序方式对比

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

Comparator接口属于临时性的比较。

其它类

System类

System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。

成员变量

System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出(显示器)和标准错误输出流(显示器)

成员方法:

native long currentTimeMillis()
void exit(int status)
void gc()
String getProperty(String key)

Math类

java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型。

BigInteger类、BigDecimal类

说明:

① java.math包的BigInteger可以表示不可变的任意精度的整数。

② 要求数字精度比较高,用到java.math.BigDecimal类
【学习打卡】Java高级(四)_第5张图片

你可能感兴趣的:(Java高级)