重点关注:
接口与类
一个类只能继承一个类,⽤extends关键字;一个雷可以实现多个接口 ,用implements关键字;接口可以继承多个接口,⽤extends关键字,接口中只能有抽象方法;接口方法都是公共public;
JDK1.8:接口中可以有公共静态方法static和默认方法 default,但方法必须有方法体;默认方法可以被实现类覆盖;
JDK1.9:接口中可以有私方法private ,但方法也必须有方法体;仅在该接口内被调用或访问;
异常捕获try-catch-finally
资源在try中被使用,在finally中被释放
JDK1.8:资源可以在try()中定义实例化,不需要在finally中进行释放;
JDK1.9:资源可以提前实例方,在try()中声明为常量,多个以“;”隔开,不需要在finally中进行释放;
String、AbstractStringBuilder 数据结构
JDK1.8及以前:都是 char[]字符数组实现,final class 不允许被继承;StringBuffer的append/length/setlength/charat方法等都加了synchronized,线程安全;
JDK1.9:字节数组final byte[]数组实现,原因:char两个字节一个字符,但大多数字符串都是拉丁字符,一个字节其实就足够了;另外提供了编码规则编码域latin-1/utf-16;
主要区别:
JDK1.8:lambda表达式:(parameters) ->{ statements; } 比如: foundInfoEntityList.forEach(e->{ foundInfoMap.put(e.getId(), e);});
函数式接口:为了引申出lambda表达式,其只有一个抽象方法的接口,其实现类的实例化方法可以缩减为lambda表达式 比如: execute(() -> System.out.println("使用lambda"));
方法引用: 以“::”跟方法名来实现对方法的引用;比如 mybatis plus 条件构造器queryWrapper queryWrapper.lambda().ge(FoundInfoDO::getLastUpdatedAt, startUpdDate);
集合流Stream处理:比如 集合名.stream() .filter()或者.sorted()或者.sum()或者.forEach();
增加了localDate API:原来的date可读性差,SimpleDateFormat线程非安全setTime时多线程易错乱;LocalDateTime等于LocalDate+LocalTime,DateTimeFormatter转单instance实现;
Optional 类空值处理:Null不应该作为返回值或用于业务逻辑判断,ifPresent()非空判断;orElse()非空返原值否则传入值;进行一些逻辑处理;
JDK1.9:模块化:之前是rt.jar太大,且通过包来区分和隔离类,但不能控制公开类方法全局可见性,包引包的冲突重复缺失问题;jre分解到新jmod下90个包,加载引入方式选择性使用;
JSHEll:命令行可以直接使用的shell命令;
多版本兼容:在版本目录下级封装各种包,方便引入不同版本jar使用;
改进Stream API增加方法:dropWhile, takeWhile, ofNullable
HTTP/2:新的 HttpClient API 实现对数据和流的服务;
JDK1.10:局部变量var,但是方法参数和全局变量不能使用;
并行full Gc的G1:并行化标记-清除-压缩算法,
JDK1.11: