对JDK各版本的特性简要进行学习和总结
JDK5
- 自动装箱与拆箱:
- 引入枚举,注解
- 静态导入
- 可变参数(Varargs)
- 内省(Introspector)
一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
- 泛型(Generic)
- for-each循环
- 协变返回类型:实际返回类型可以是要求的返回类型的一个子类型
JDK6
- AWT新增加了两个类:Desktop和SystemTray
Desktop 用来通过系统默认程序来执行一个操作,如使用默认浏览器浏览指定的URL,用默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档等。
SystemTray 可以用来在系统托盘区创建一个托盘程序
-
使用JAXB2来实现对象与XML之间的映射
-
StAX
-
使用Compiler API,动态编译Java源文件
-
轻量级Http Server API
-
插入式注解处理API
-
提供了Console类用以开发控制台程序,位于java.io包中
-
对脚本语言的支持如: ruby,groovy, javascript
-
Common Annotations
-
嵌入式数据库 Derby
JDK7
- 对Java集合(Collections)的增强支持,可直接采用[]、{}的形式存入对象,采用[]的形式按照索引、键值来获取集合中的对象。如:
List<String>list=[“item1”,”item2”];//存
Stringitem=list[0];//直接取
Set<String>set={“item1”,”item2”,”item3”};//存
Map<String,Integer> map={“key1”:1,”key2”:2};//存
Intvalue=map[“key1”];//取
-
在Switch中可用String
-
数值可加下划线用作分隔符(编译时自动被忽略)
-
支持二进制数字
-
简化了可变参数方法的调用
-
调用泛型类的构造方法时,可以省去泛型参数,编译器会自动判断
-
Boolean类型反转,空指针安全,参与位运算
-
char类型的equals方法: booleanCharacter.equalsIgnoreCase(char ch1, char ch2)
-
安全的加减乘除
-
Map集合支持并发请求
JDK8
-
接口的默认方法:即接口中可以声明一个非抽象的方法做为默认的实现,但只能声明一个,且在方法的返回类型前要加上“default”关键字。
-
Lambda 表达式,如:
Collections.sort(names,(String a, String b) -> {
returnb.compareTo(a);
});
//对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字。如:
Collections.sort(names,(String a, String b) -> b.compareTo(a));
//或:Collections.sort(names, (a, b) -> b.compareTo(a));
-
函数式接口:是指仅仅只包含一个抽象方法的接口,要加@FunctionalInterface注解
-
使用 :: 关键字来传递方法或者构造函数引用
-
多重注解
-
还增加了很多与函数式接口类似的接口以及与Map相关的API等
JDK9
- Java 平台级模块系统
当启动一个模块化应用时, JVM 会验证是否所有的模块都能使用,这基于
requires
语句——比脆弱的类路径迈进了一大步。模块可以更好地强制结构化封装应用并明确依赖。
- Linking
创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。
-
JShell : 交互式 Java REPL
-
改进的 Javadoc
每个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。
-
集合工厂方法
-
改进的 Stream API
Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,提供一个 Predicate (判断条件)来指定什么时候结束迭代
-
私有接口方法
-
HTTP/2
代替老旧的
HttpURLConnection
API,并提供对 WebSocket 和 HTTP/2 的支持。
- 多版本兼容 JAR
JDK10
- 查看当前 JDK 管理根证书
- JEP314,使用附加的 Unicode 语言标记扩展
- 应用程序类数据(AppCDS)共享
- 统一的 GC 接口
- var 类型推断
JDK11
- 本地变量类型推断(Local Var)
- 字符串加强
- 集合加强
- Stream 加强
- Optional 加强
- InputStream 加强
- HTTP Client API
- 读写文件
- 单文件代码
JDK12
- Shenandoah低暂停时间垃圾收集器(实验性)
添加一个名为Shenandoah的新垃圾收集(GC)算法,通过与正在运行的Java线程同时进行疏散工作
来减少GC暂停时间。使用Shenandoah的暂停时间与堆大小无关,这意味着无论堆是200MB还是200GB,都
将具有相同的一致暂停时间。
- Microbenchmark Suite
在JDK源代码中添加一套基本的微基准测试,使开发人员可以轻松运行现有的微基准测试并创
建新的基准测试。
- JVM常量API
引入API来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量。
- 一个AArch64端口,而不是两个
arm64在保留32位ARM端口和64位aarch64端口的同时,删除与端口相关的所有源。
- 默认CDS档案
- 从G1中立即返回未使用的已提交内存
- 核心库java.lang中支持Unicode11
- 核心库java.text支持压缩数字格式
- 安全库java.security
- 安全库javax.net.ssl
- 删除项
核心库/ java.util.jar中,删除java.util
JDK13
- Dynamic CDS Archives
这一特性是在JEP310:Application Class-Data Sharing基础上扩展而来的,Dynamic CDS Archives中的CDS指的就是Class-Data Sharing。
- ZGC: Uncommit Unused Memory
而在Java 13中,JEP 351再次对ZGC做了增强,本次 ZGC 可以将未使用的堆内存返回给操作系统。之所以引入这个特性,是因为如今有很多场景中内存是比较昂贵的资源,在以下情况中,将内存还给操作系统还是很有必要的
- Reimplement the Legacy Socket API
使用易于维护和调试的更简单、更现代的实现替换 java.net.Socket 和 java.net.ServerSocket API。
- Switch Expressions (Preview)
switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。
- Text Blocks (Preview)
text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。
JDK14
- instanceof模式匹配
通常情况下我们使用instanceof来探测类的真实类型,如果符合该类型,则可进行强制转换。
- Switch表达式
java14引入了新形式的switch标签“case L->”,表示如果匹配,则只执行标签右边的代码。switch标签允许在每种情况下使用逗号分隔多个常量。
- 记录类型(Record Type)的引入
Java 14中记录类型(Record Type)作为预览特性被引入。记录对象允许使用紧凑的语法来声明类,和枚举类型一样,记录也是类的一种受限形式。在idea2020.1中,创建Record与创建类和枚举一样,可以在创建时直接选择对应的类型。
- 文本块作为预览特性保留
文本块是Java语言的新语法,可以用来表示任何字符串,具有更高的表达能力和更少的复杂度。
文本块的开头定界符是由三个双引号字符(""")组成的序列,后面跟0个或多个空格,最后跟一个行终止符。内容从开头定界符的行终止符之后的第一个字符开始。
结束定界符是三个双引号字符的序列。内容在结束定界符的第一个双引号之前的最后一个字符处结束。与字符串文字中的字符不同,文本块的内容中可以直接包含双引号字符。允许在文本块中使用",但不是必需的或不建议使用。与字符串文字中的字符不同,内容可以直接包含行终止符。允许在文本块中使用\n,但不是必需或不建议使用。