0303 - JDK新特性
2021-04-18 09:52:43 16 举报
AI智能生成
架构师技术栈-JDK新特性
作者其他创作
大纲/内容
JDK11新特性
String新增的方法
JDK11-String新增的方法
Optional新增的方法
局部变量类型推断的升级
HttpClient
更简化的编译运行程序
其它新特性
Java12新特性
switch方法
Shenandoah GC:低停顿时间的GC(预览)
常量API
微基准测试套
只保留一个
默认生成类数
可中断的G
增强G1
支持unic
String
Files新
JDK13新特性
switch
TextBI
关于Text
TextBl
动态CDS档
ZGC-取消
重新实现有伴
JDK17新特性
JDK7新特性
try-with-resources语句:简化资源的关闭操作,会自动在语句结束后将每个资源正确关闭。
switch语句支持String类型
单个catch捕获多个异常,如catch(IOException|SQLException|FileNotFoundException ex)
泛型实例化类型自动推断,如List<Integer> list = new ArrayList<>();
数值可以使用下划线分割,如int n = 1_000_000表示1000000
多核并行计算支持:fork/join框架
JDK8新特性
函数式接口
自定义函数接口
只有一个抽象方法的接口
@FunctionalInterface注解的接口都是函数式接口
内置函数接口
位于java.util.function包中
用法
通常作为方法参数来使用(也可以作为返回值):Stream的map方法接受Function<T, R>作为参数,filter使用Predicate<T>作为参数,ForEach使用Consumer<T>作为参数
在JDK8中,Lambda表达式就是一个函数式接口的实例。
lambda表达式
定义:Lambda表达式体现了数据输入(方法参数)于输出(返回结果)的对应关系,实际上是一个回调函数。
语法:()->{} 分别表示“参数->方法体”
Lambda的本质:接口的实例
可用于替代匿名内部类,它和匿名内部类的区别:
1、this关键字指向不同:匿名内部类中this指代当前匿名类对象,而Lambda表达式中this指向包含它的类的对象;
2、编译方式不同:Java编译器将Lambda表示式编译成类的私有方法,使用Java7的invokedynamic字节码指令来动态绑定这个方法。
1、this关键字指向不同:匿名内部类中this指代当前匿名类对象,而Lambda表达式中this指向包含它的类的对象;
2、编译方式不同:Java编译器将Lambda表示式编译成类的私有方法,使用Java7的invokedynamic字节码指令来动态绑定这个方法。
方法引用/构造器引用
定义
可用来替换Lambda表达式,省略参数传递的表示,使代码更简洁和更具可读性
情况一 对象::非静态方法
Consumer<String> con1 = s -> System.out.println(s);
-----------------------------------------------------------
Consumer<String> con2 = System.out :: println;
-----------------------------------------------------------
Consumer<String> con2 = System.out :: println;
情况二 类::静态方法
Comparator<Integer> com1 = (t1, t2) -> Integer.compare(t1,t2);
------------------------------------------------------------------------
Comparator<Integer> com2 = Integer :: compare;
------------------------------------------------------------------------
Comparator<Integer> com2 = Integer :: compare;
Function<Double, Long> func1 = t -> Math.round(t);
------------------------------------------------------------
Function<Double,Long> func2 = Math :: round;
------------------------------------------------------------
Function<Double,Long> func2 = Math :: round;
情况三 类::非静态方法
Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2);
-----------------------------------------------------------------
Comparator<String> com2 = String :: comparator;
-----------------------------------------------------------------
Comparator<String> com2 = String :: comparator;
BiPredicate<String, String> pre1 = (s1, s2) -> s1.equals(s2);
------------------------------------------------------------------
BiPredicate<String, String> pre2 = String :: equals;
------------------------------------------------------------------
BiPredicate<String, String> pre2 = String :: equals;
构造器引用
Supplier<Employee> sup = new Supplier<Employee>(){
@Override
public Employee get(){
return new Employee();
}
}
@Override
public Employee get(){
return new Employee();
}
}
Supplier<Employee> sup1 = () -> new Employee();
Supplier<Employee> sup2 = Employee :: new;
数组引用
Function<Integer, String[]> func1 = length -> new String[length];
Function<Integer, String[]> func2 = String[] :: new;
Stream API
简介
创建方式
使用方法
接口的增强
Optional类
用于防止Null Pointer Exception的出现,避免null值判断。可配合Lambda表达式使用,使代码更简洁美观,包括(工厂方法of、ofNullable)、filter、map、orElse、get等方法
常用方法
isPresent():判断容器中是否有值
ifPresent(Consume lambda) :容器若不为空则执行括号中的Lambda表达式
T get() :获取容器中的元素,若容器为空则抛出NoSuchElement异常
T orElse(T other):获取容器中的元素,若容器为空则返回括号中的默认值
新的Date/Time API(JSR310)
LocalDate
LocalTime
LocalDateTime
其它新特性
重复注解
重复注解,允许一个注解同时出现多次。
@Repeatable:允许在同一声明类型(类、属性、方法)上多次使用同一个注解
类型注解
通用目标类型推断
JDK的更新
集合的流式操作
并发
并行(parallel)数组
Array类中增加对数组元素进行排序、过滤、分组相关并行操作API,比如parallelSort方法
Arrays
Number和Math
IO/NIO的改进
Reflection获取形参名
String:jion()
新增了一个新的join方法,该方法实现字符串的拼接、可以把它看作split方法的逆操作
Files
java.nio.file.Files类
为使用流读取文件行及访问目录提供了一些简单的方法,如copy、list、walk、find等方法
JDBC增强
新增API
java.sql.DriverAction 接口
java.sql.SQLType 接口
java.sql.JDBCType 枚举
Base64类
提供原生Base64编码、解码支持,不需要再依赖第三方类库
Base64.getEncoder().encodeToString(bytes)
Base64.getDecoder().decode(str)
java.util.concurrent 并发包
CompletionStage<T> 接口
CompletableFuture类
函数式异步编程辅助类
实现了CompletionStage和Future接口
CompletionService
用于获取多个异步任务的执行结果
原理:将已执行完成的任务保持在一个阻塞队列中,使用take、poll方法从队列中取出任务获得执行结果
好处:由于队列的特性,可以保证先执行完成的任务先拿到结果,因此可以减少等待时间。
实现类:ExecutorCompletionService 使用Executor来执行任务
java.util.concurrent.atomic
增加:DoubleAccumulator、DoubleAdder、LongAccumulator、LongAdder四个类
LongAdder和AtomicLong区别
原有的Atomic系列类通过CAS来保证并发时操作的原子性,但是高并发也意味着CAS的失败次数增多,失败次数增多会引起更多线程的重试,最后导致AtomicLong的效率降低
低并发时两个类差不多,而高并发时使用LongAdder更高效
新的编译工具
jjs
jdeps
JDK9新特性
JDK目录结构的改变
模块化系统
Java的REPL工具
接口中声明私有方法
砖石操作符的语法升级
try结构的语法升级
JDK8之前的写法
JDK8的写法
JDK9的写法
String底层存储结构的变更
集合工厂方法创建只读集合
JDK8创建只读集合方式一
JDK8创建只读集合方式二
JDK8创建只读集合方式三
JDK9创建只读集合
InputStream的transferTo()方法
Stream API新增的四个方法
Optional的新方法stream()
升级的Nashorn引擎
JDK10新特性
局部变量类型推断
集合新增创建不可变集合的方法
0 条评论
下一页