jdk 9 新特性
1.集合加强
jdk9 为所有集合(List/Set/Map)都增加了 of 和 copyOf 方法,用来创建不可变集合,即一旦创建就无法再执行添加、删除、替换、排序等操作,否则将报错: java.lang.UnsupportedOperationException 异常。
一般在特定场景下使用。
List strs = List.of("Hello", "World"); List strsCopy = List. copyOf(strs); Set strs = Set.of("Hello", "World"); Map maps = Map.of("Hello", 1, "World", 2);
2.私有接口方法
jdk 8 提供了默认方法(Default) 和静态方法,打破了之前接口只能定义方法而不能存在行为。jdk 9 则允许接口定义私有方法。私有方法可以作为通用方法放在默认方法调用,不过实际中并无太大用处。
3.垃圾收集机制
jdk 9 把G1 作为默认的垃圾手机器实现。替换了 jdk 7 和 jdk8 的默认垃圾收集器实现: Parallel Scavenge(新生代) + Parallel Old(老年代)
4. I/O 流加强
java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据
readAllBytes: 读取 InputStream 中的所有剩余字节
readNBytes: 从InputStream 中读取指定数量的字节到数组中
transferTo: 读取InputStream 中全部字节写入到指定的 OutputStream 中
5.Jshell 工具
jdk9 引入了 jshell 这个交互性工具,让 java 也可以像脚本语言一样来允许,可以从控制台启动 jshell ,在 jshell 中直接输入表达式并查看其执行结果。当需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用。
jdk 10 新特性
1.局部变量类型推断
局部变量类型推断可以说是jdk10中最值得注意的特性,这是Java语言开发人员为了简化Java应用程序的编写而采取的又一步,举个例子:
原先我们需要这么定义一个list
List<String> list = new ArrayList<>();
使用局部类型推断var关键词定义
var list = new ArrayList<String>();
不过局部变量类型推断仅仅适用在:
有初始化值的局部变量
增强 for 循环中的索引
传统 for 循环中声明的局部变量
Oracle 的 Java 团队申明,以下不支持局部变量类型推断:
方法参数
构造函数参数
方法返回类型
字段
catch 代码块(或任何其他类型的变量声明)
2.线程本地握手
jdk10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停
3.GC改进和内存管理
jdk10中有2个JEP专门用于改进当前的垃圾收集元素。
第一个垃圾收集器接口是(JEP 304),它将引入一个纯净的垃圾收集器接口,以帮助改进不同垃圾收集器的源代码隔离。
预定用于Java 10的第二个JEP是针对G1的并行完全GC(JEP 307),其重点在于通过完全GC并行来改善G1最坏情况的等待时间。G1是Java 9中的默认GC,并且此JEP的目标是使G1平行。
jdk 11 新特性
1. 字符串加强
// 判断字符串是否为空白 " ".isBlank(); // true // 去除首尾空格 " Javastack ".strip(); // "Javastack" // 去除尾部空格 " Javastack ".stripTrailing(); // 去除首部空格 " Javastack ".stripLeading(); // "Javastack " // 复制字符串 "Java".repeat(3); // "JavaJavaJava" // 行数统计 "A B C".lines().count(); // 3
2. HttpClient API
这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在java.net包中找到这个 Api
3. 用于 Lambda 参数的局部变量语法
用于 Lambda 参数的局部变量语法简单来说就是支持类型推导:
var x = new A();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...
4.ZGC
从JDK 9开始,JDK使用G1作为默认的垃圾回收器。G1可以说是GC的一个里程碑,G1之前的GC回收,还是基于固定的内存区域,而G1采用了一种“细粒度”的内存管理策略,不在固定的区分内存区域属于surviors、eden、old,而我们不需要再去对于年轻代使用一种回收策略,老年代使用一种回收策略,取而代之的是一种整体的内存回收策略。这种回收策略在我们当下cpu、内存、服务规模都越来越大的情况下提供了更好的表现,而这一代ZGC更是有了突破性的进步。
从原理上来理解,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行,一般而言,主要有如下几种方式优化"Stop the world":
使用多个线程同时回收(并行回收)
回收过程分为多次停顿(增量回收)
在程序运行期间回收,不需要停顿或只停顿很短时间(并发回收)
只回收内存而不整理内存
ZGC主要采用的是并发回收的策略,相较于G1 ZGC最主要的提升是使用Load Barrier技术实现,引用R大对于ZGC的评价:
与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。
jdk 12新特性
1. Switch Expressions
Switch Expressions 或者说起相关的 Pattern Matching 特性,为我们提供了勾勒出了 Java 语法进化的一个趋势,将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率
2.Shenandoah GC
新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200 MB 还是 200 GB,都将具有相同的暂停时间。
jdk 13 新特性
JDK13中包含的5个特性,能够改变开发者的编码风格的主要有Text Blocks和Switch Expressions两个新特性,但是这两个特性还处于预览阶段。
而且,JDK13并不是LTS(长期支持)版本,如果你正在使用Java 8(LTS)或者Java 11(LTS),暂时可以不必升级到Java 13.
各个版本发布时间
jdk 12 时间: 2019-3-19
jdk 13 时间: 2019 - 9 -17
特性总结:
JDK1.4 正则表达式,异常链,NIO,日志类,XML解析器,XLST转换器 JDK1.5 自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环 JDK1.6 提供动态语言支持、提供编译API和卫星HTTP服务器API,改进JVM的锁,同步垃圾回收,类加载 JDK1.7 提供GI收集器、加强对非Java语言的调用支持(JSR-292,升级类加载架构 JDK1.8 Lambda 表达式、方法引用、默认方法、新工具、Stream API、Date Time API 、Optional 类、Nashorn, JavaScript 引擎
参考:https://blog.csdn.net/jlq_diligence/article/details/102775215
参考:https://blog.csdn.net/J080624/article/details/85259041