Hello,I'm Shendi
每当Java出新版本我会第一时间更新
目录
JDK 1.0
1996-01-23 Oak(橡树)
初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,
性能比较差,运行速度慢
JDK 1.1
1997-02-19
JDBC(Java DataBase Connectivity)
支持内部类
RMI(Remote Method Invocation)
反射
Java Bean
JDK 1.2
1998-12-08 Playground(操场)
集合框架
JIT(Just In Time)编译器
对打包的Java文件进行数字签名
JFC(Java Foundation Classes)包括Swing1.0,拖放和Java2D类库
Java插件
JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型
Applet中添加声音支持
JDK 1.3
2000-05-08 Kestrel(红隼)
Java Sound API
Jar文件索引
对Java的各个方面都做了大量优化和增强
JDK 1.4
2004-02-06 Merlin(隼)
XML处理
Java打印服务
Logging API
Java Web Start
JDBC 3.0API
断言
Preferences API
链式异常处理
支持IPV6
支持正则表达式
引入Image I/O API
JDK 1.5新特性
2004-9-30(Tiger)老虎
泛型
增强循环,可以使用迭代方式
自动装箱与自动拆箱
类型安全的枚举
可变参数
底层就是一个数组,根据参数个数不同,会创建不同长度的数组
在传递时可以直接传递数组(传递数组后就不能再传递其余可变参数)
静态引入
元数据(注解)
Instrumentation
JDK 1.6
2006-12-11 Mustang(野马)
支持脚本语言
JDBC 4.0API
Java Compiler API
可插拔注解
增加对Native PKI(Public Key Infrastructure),Java GSS(Generic Security Service)
Kerberos和LDAP(Lightweight Directory Access Protocol)支持
继承Web Services
JDK 7新特性:
2011-07-28 Dolphin(海豚)
1.switch支持字符串变量
2.泛型实例化类型自动推断
ArrayList<String> list = new ArrayList<>();
3.新的整数字面表达方式 "ob"前缀 和 "_"连接符
1.表示二进制字面值的前缀ob
以下三个值相同
byte b1 = ob00100001;
byte b2 = 0x21;
byte b3 = 33;
2.字面常量数字的下划线.用下划线连接整数提升其可读性,自身无含义,不可用在数字的起始和末尾
Java编码语言对给数值型的字面值加下划线有严格的规定。如上所述,你只能在数字之间用下划线。你不能用把一个数字用下划线开头,或者已下划线结尾。这里有一些其它的不能在数值型字面值上用下划线的地方:
在数字的开始或结尾
对浮点型数字的小数点附件
F或L下标的前面
该数值型字面值是字符串类型的时候
float pi1 = 3_.1415F; // 无效的; 不能在小数点之前有下划线
float pi2 = 3._1415F; // 无效的; 不能在小数点之后有下划线
long socialSecurityNumber1=999_99_9999_L;//无效的,不能在L下标之前加下划线
int a1 = _52; // 这是一个下划线开头的标识符,不是个数字
int a2 = 5_2; // 有效
int a3 = 52_; // 无效的,不能以下划线结尾
int a4 = 5_______2; // 有效的
int a5 = 0_x52; // 无效,不能在0x之间有下划线
int a6 = 0x_52; // 无效的,不能在数字开头有下划线
int a7 = 0x5_2; // 有效的 (16进制数字)
int a8 = 0x52_; // 无效的,不能以下划线结尾
int a9 = 0_52; // 有效的(8进制数)
int a10 = 05_2; // 有效的(8进制数)
int a11 = 052_; // 无效的,不能以下划线结尾
4.在单个catch块中捕获多个异常,以及用升级版的类型检查重新抛出异常
catch代码块得到了升级,用以在单个catch块中处理多个异常,如果你要捕获多个异常并且它们包含相似的代码,使用这一特性会减少代码重复
catch(IOException | SQLException | Exception ex) {
}
这种情况下ex变量是final的
5.try-with-resources语句
try-with-resources语句是一个声明一个或多个资源的try语句,一个资源作为一个对象,必须在程序结束后关闭
try-with-resources语句确保在语句的最后每个资源都被关闭,任何实现了Java.lang.AutoCloseable和java.io.Closeable的对象都可以使用try-with-resource来实现异常处理和关闭资源
try-with-resource可以声明多个资源(声明语句之间用分好分割,最后一个可忽略分号)
try (流创建等需要关闭的资源打开操作,多个之间用;隔开) {操作} catch(Exception 这里可加catch可不加) {}
引入JavaNIO.2开发包
null值的自动处理
JDK 1.8
2014-03-18
Lambda表达式
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)
方法引用
方法引用提供了非常有用的语法,可以直接引用已有的Java类或对象(实例)的方法或构造器.
与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码
默认方法
默认方法就是一个在接口里面有了一个实现的方法
新工具
新的编译工具 如:Nashorn引擎 jjs 类依赖分析器jdeps
Stream API
新添加的Stream API(java.utils.stream)把真正的函数式编程风格引入到Java中
Data Time API
加强对日期与时间的处理
Optional类
Optional类已经成为Java8类库的一部分,可用来解决空指针异常
Nashorn,JavaScript引擎
Java8提供了一个新的Nashorn JavaScript引擎,它允许我们在JVM上运行特定的JavaScript应用
JDK 9新特性:
2017-9-22
模块系统
模块是一个包的容器,Java9最大的变化之一是引入了模块系统(Jigsaw项目)
REPL(JShell)
交互式编程环境
在cmd中输入JShell 可以帮你自动创建类
以及运行一些简单的方法
HTTP2客户端
HTTP/2标准是HTTP协议的最新版本,新的HTTPClient API支持WebSocket和HTTP2流以及服务器推送特性
改进的Javadoc
Javadoc现在支持在API文档中的进行搜索,另外Javadoc的输出现在符合兼容HTML5标准
多版本兼容Jar包
多版本兼容Jar功能能让你创建仅在特定版本的Java环境中运行库程序时选择使用的class版本
集合工厂方法
List,Set和Map接口中,新的静态工厂方法可以创建这些集合的不可变实例
私有接口方法
在接口中使用private私有方法.我们可以使用private访问修饰符在接口中编写私有方法
进程API
改进的API来控制和管理操作系统进程.改进java.lang.ProcessHandle及其嵌套接口info来让开发者逃离时常因为要获取一个本地进程的PID而不得不适用本地代码的窘境
改进的Stream API
改进的Stream API添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询
改进 try-with-resources
如果你已经有一个资源是final或等效于final变量,您可以在try-with-resources语句中使用该变量,而无需再try-with-resources语句中声明一个新变量
改进的弃用注解@Deprecated
可以标记Java API的状态 可以表示被标记的API将会被移除,或者已被破坏
改进钻石操作符(Diamond Operator)
匿名类可以使用钻石操作符(Diamond Operator)
改进Optional类
java.util.Optional添加了很多新的有用方法,Optional可以直接转为stream
多分辨率图像API
定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了
改进的CompletableFuture API
CompletableFuture类的异步机制可以在ProcessHandle.onExit方法退出时执行操作
轻量级的JSON API
内置了一个轻量级的JSON API
响应式流(Reactive Streams)API
Java9中引入了新的响应式流API来支持Java9中的响应式编程
模块化
可定制JRE:更小的运行时镜像
更确定的模块依赖关系:避免Jar Hell问题
与 OSGI 的比较
模块的定义:
模块是一个命名的,自我描述的代码和数据的集合
模块的代码被组织成多个包,每个包中包含Java类和接口
模块的数据则包括资源文件和其他静态信息
模块声明文件
模块声明文件:module-info.java
新的关键字:module 声明一个模块
模块名称的规则 与Java包的命名规则相似
Java 10
2018-3-21
JEP286,var局部变量类型推断
JEP296,将原来用Mercurial管理的众多JDK仓库代码,合并到一个仓库中,简化开发和管理过程
JEP304,统一的垃圾回收接口
JEP307,G1垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟
JEP310,应用程序类数据(AppCDS)共享,通过跨进共享通用类元数据来减少内存占用空间,和减少启动时间
JEP312,ThreadLocal握手交互.在不进入到全局JVM安全点(Safepoint)的情况下,对线程执行回调,优化可以只停止单个线程,而不是停全部线程或一个都不停
JEP313,移除JDK中附带的javah工具,可以使用javac -h代替
JEP314,使用附加的Unicode语言标记扩展
JEP317,能将堆内存占用分配给用户指定的备用内存设备
JEP317,使用Graal基于Java的编译器,可以预先把Java代码编译成本地代码来提升效能
JEP318,在OpenJDK中提供一组默认的根证书颁发机构证书,开源目前Oracle提供的JavaSE的根证书,这样OpenJDK对开发人员使用起来更方便
JEP322,基于时间定义的发布版本,即上述提到的发布周期,版本号为...分别是大版本,中间版本,升级包和补丁版本
Java 11
2018-09-25
181:Nest_Based访问控制
309:动态类文件常量
315:改善Aarch64 intrinsic
318:无操作垃圾收集器ZGC
320:消除Java EE和CORBA模块
321:HTTP客户端(标准)
323:局部变量的语法?参数
324:Curve25519和Curve448关键协议
327:Unicode 10
328:飞行记录器
329:ChaCha20和Poly1305加密算法
330:发射一列纵队源代码程序
331:低开销堆分析
332:传输层安全性(Transport Layer Security,TLS)1.3
333:动作,一个可伸缩的低延迟垃圾收集器(实验)
335:反对Nashorn JavaScript引擎
336:反对Pack200工具和API
Java12
2019-3-19
在Java12中,switch可以有返回值 并且使用->直接
break可以携带返回值,如果需要break返回值,则需每一个case后都有返回值或者抛出一个异常
int num = switch(value) {
case 1 ->1;
case 2 ->2;
case 3,4 ->3;
case 5: break 5;
case 6 -> {System.out.println("hello world");//没有返回则抛出异常}
}
Java13
2019-9-17
Java13中,switch支持如下写法
int date = switch (day) {
case MONDAY, FRIDAY, SUNDAY : yield 6;
case TUESDAY : yield 7;
case THURSDAY, SATURDAY : yield 8;
case WEDNESDAY : yield 9;
default : yield 1; // default条件是必须的
};
支持文本块 使用三个"""
起始的"""结尾必须换行
String text = """
hello world
! """
文本块是在13中是预览功能,使用前需要先启用
手动编译:
javac --release 13 --enable-preview ...
手动运行
java --enable-preview ...
Java14
2020-3-17
改进的switch表达式在14中获得了完全的支持
instanceof支持模式匹配(语言特性 预览特性)
使用instanceof和instanceof里的对象不用强转了
NullPointerException(JVM特性)
14的这个异常更加详细,精确到某个属性
Record(预览功能)
java14提供了解决get,set,toString等代码冗余,
Record会提供equals,hashCode,toString方法的实体,可以重构如下
public record Clazz(int a,double b,String c) {}
通过record,可以自动地得到equals,hashCode,toString的实现,还有构造器和getter方法
文本块中加入 \ 可以不换行
Java15
2020-9-15
文本块转正
ZGC垃圾回收器转正
Shenandoah转正
移除 Nashorn JavaScript Engine(JDK脚本执行引擎)
在JDK11标记过期,15完全移除
CharSequence新增isEmpty默认方法
持续更新中...