JDK1.8新特性(四):接口、线程安全的时间与注解

接口中的默认方法与静态方法

JDK1.8支持在接口中有默认方法与静态方法了,之前接口用只能有抽象方法和静态常量

  1. default:修饰接口的默认实现(为了提高兼容性,假如一个接口增加了方法,那么实现类都需要去实现新增的方法,所以添加了默认实现,让以前的实现类不需要去重写添加的方法),并且遵循两个原则
    1. 类优先原则:并且对应的default方法,优先级较低,低于父类的方法!!!(即子类实现了接口拥有默认方法,同时又继承了父类有一个相同形式的方法,那么会优先采用父类的)
    2. 接口冲突原则:接口是可以被类多实现的,如果有两个接口,都有统一形式的默认方法,那么其实现类必须要重写默认方法!!!
  2. static:JDK1.8的接口支持静态方法,因为接口也是一个class文件,同样有自己类文件的内存空间,可以直接使用static

线程安全的时间格式化

演化过程

Date->Calendar->LocalDateTime

以前的时间类都不是线程安全的,因为是可变的

JDK1.8提供了LocalDate(日期)、LocalTime(时间)、LocalDateTime(时间和日期)时间类,是不可变的,所以是线程安全的!!! 只要改变会产生新的实例,解决了多线程安全问题

SimpleDateFormat的多线程安全问题

当使用同一个SimpleDateFormat去进行格式化时间,会出现线程安全问题(抛错为无法转换)

解决方案
  • 加锁
  • 改用JDK1.8的LocalDate和DateTimeFormatter进行转换
    在这里插入图片描述
    下面来认识以下Api
时间类

新特性提供的实践类都是不可变的对象,并且采用ISO-8601的日历系统规范(国家化组织规范)

  1. LocalDate:表示日期
  2. LocalTime:表示时间
  3. LocalDateTime:表示时间和日期

这三个类的使用方式是一样的

  • now:使用静态now方法去创建对象,并获取本地当前时间

  • of:静态of方法可以指定时间去创建新的实例

  • plus:提供了一系列的plus方法,可以对应加年月日,并且改变了就会返回一个新的实例

  • minus:提供了一系列的minus方法,可以对应减少年月日,并且改变了就会返回一个新的实例

  • get:提供了一系列方法,可以获取对应的年月日

时间戳

以Unix元年(1970.01.01 00:00:00到某个时间的毫秒值称为时间戳)

使用Instance方法获取时间戳,以UTC格林时间为准(不是本地时间)

  • now:静态方法now,获取Instance对象,并且时间戳是据当前的格林时间

  • atOffset:添加时间偏移量,并且参数为ZoneOffset枚举,产生一个OffSetDateTime

  • toEpochMill:转化为毫秒格式,即获取时间戳

  • ofEpochSecond:从Unix元年添加毫秒获取新的时间戳

时间与日期间隔
  • 时间间隔用Duration表示
  • 日期间隔用Period表示

对于时间间隔(Duration)

  • between:静态方法,可以计算两个时间戳Instance之间的时间间隔,也有重载方法计算LocalTime之间的时间间隔
  • toMills:时间日期转换为毫秒

对于日期间隔(Period)

  • between:静态方法,可以计算两个LocalDate的日期间隔
  • get:提供一系列get方法获取相差的年月日

时间校正器:TemporalAdjuster

有时候我们要对时间进行调整,比如调整到下一个周日,下一个工作日,当然我们使用原本时间类就可以进行加减,但这是需要我们手动去计算,比如跳转到哪里要加几天、几年,而使用时间矫正器不需要我们去计算

我们使用TemporalAdjusters去减少我们的计算来调整时间

比如调整到下一个周日
在这里插入图片描述

时间格式化:DateTimeFormatter

使用DateTimeFormatter可以进行格式化

有一系列默认的ISO标准,表明要时间、日期或者时间日期

  • ISO_DATE:只要日期

当然我们也可以自定义格式

  • ofPattern:静态方法,可以进行自定义格式化

时区处理

JDK1.8也加入了对时区的支持

  • ZonedDate:
  • ZonedTime
  • ZonedDateTime

其中每个时区都对应着ID,地区ID都为区域/城市的格式,比如Asis/Shanghai,所有支持的时区都保存在ZonedID,

可以使用ZoneId.getAvailableZoneIds查看所有支持的时区

我们可以根据时区去构建时间
在这里插入图片描述

注解

JDK1.8提供了注解的改进

  • 重复注解:给类进行重复注解
  • 类型注解

重复注解

  • 使用重复注解必须给注解提供一个容器

  • 使用重复注解必须给重复注解加上@Repeable注解,表明该注解可以重复使用,并且在里面使用容器

在这里插入图片描述

类型注解

这个注解的作用是可以作用与参数的类型!!!
在这里插入图片描述
在Target添加TYPE_PARAMETER

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值