接口中的默认方法与静态方法
JDK1.8支持在接口中有默认方法与静态方法了,之前接口用只能有抽象方法和静态常量
- default:修饰接口的默认实现(为了提高兼容性,假如一个接口增加了方法,那么实现类都需要去实现新增的方法,所以添加了默认实现,让以前的实现类不需要去重写添加的方法),并且遵循两个原则
- 类优先原则:并且对应的default方法,优先级较低,低于父类的方法!!!(即子类实现了接口拥有默认方法,同时又继承了父类有一个相同形式的方法,那么会优先采用父类的)
- 接口冲突原则:接口是可以被类多实现的,如果有两个接口,都有统一形式的默认方法,那么其实现类必须要重写默认方法!!!
- static:JDK1.8的接口支持静态方法,因为接口也是一个class文件,同样有自己类文件的内存空间,可以直接使用static
线程安全的时间格式化
演化过程
Date->Calendar->LocalDateTime
以前的时间类都不是线程安全的,因为是可变的
JDK1.8提供了LocalDate(日期)、LocalTime(时间)、LocalDateTime(时间和日期)时间类,是不可变的,所以是线程安全的!!! 只要改变会产生新的实例,解决了多线程安全问题
SimpleDateFormat的多线程安全问题
当使用同一个SimpleDateFormat去进行格式化时间,会出现线程安全问题(抛错为无法转换)
解决方案
- 加锁
- 改用JDK1.8的LocalDate和DateTimeFormatter进行转换
下面来认识以下Api
时间类
新特性提供的实践类都是不可变的对象,并且采用ISO-8601的日历系统规范(国家化组织规范)
- LocalDate:表示日期
- LocalTime:表示时间
- 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