Java 5
2004 年 Sun 公司发布 J2SE5(没错,Sun 公司又改名字了),版本代号 Tiger,这个版本的 Java 语言新功能如下:
-
1、泛型。
-
2、Metadata,元数据,描述数据的数据。
-
3、自动装箱和拆箱,也就是基本数据类型(如 int)和它的包装类型(如 Integer)自动帮你转换(其实背后是相关的方法帮你做了转换工作)。
-
4、枚举。
-
5、可变参数,一个函数可以传入数量不固定的参数值。
-
6、增强版的 for 循环。
-
7、改进了 Java 的内存模型,提供了 java.util.concurrent 并发包。
Java 6
2006 年 Sun 公司发布 JavaSE6(不要抱怨又改名字了,因为马上就要见不到 Sun 公司了),版本代号 Mustang(野马),也是个经典版本,直到现在也有很多人在写(讲个笑话,现在 Java8 的使用者,绝大多数都是用着 Java8 写着 Java 6 的代码,其实我也是,逃~),这个版本的 Java 主 要改变如下:
-
1、提供动态语言支持。
-
2、提供编译 API,即 Java 程序可以调用 Java 编译器的 API。
-
3、Swing 库的一些改进。
-
4、JVM 的优化。
-
5、微型 HTTP 服务器 API 等。
这个版本的 Java 更多是对之前版本功能的优化,增强了用户的可用性和修复了一些漏洞,所以直到现在也有很多项目在使用(给项目用的Java版本升个级可能会有意想不到的的问题,所以保持原样就好了,运维大哥要溜了溜了~)。
Java 7
20011 年,这时候 Oracle 已经把 Sun 公司收购了(2009 年后 Java 就是 Oracle 的人了),Oracle 发布 JavaSE7,新增的功能如下:
1、放宽 switch 的使用,我们可以在 switch 中使用字符串啦,而在这个版本之前,只能使用字符和数字。
2、try-resource-with 语句,帮助我们自动化管理资源,如打开文件,对文件操作结束后,JVM 可以自动帮我们关闭文件资源,当然前提是你要用 try-resource-with 语句。
3、加入了类型推断功能,比如你之前版本使用泛型类型时这样写 ArrayList<User> userList= new ArrayList<User>();
,这个版本只需要这样写 ArrayList<User> userList= new ArrayList<>();
,也即是后面一个尖括号内的类型,JVM 帮我们自动类型判断补全了。
4、简化了可变参数的使用。
5、支持二进制整数,在硬件开发中,二进制数更常用,方便人查看。
6、支持带下划线的数值,如 int a = 100000000;
,0 太多不便于人阅读,这个版本支持这样写 int a = 100_000_000
,这样就对数值一目了然了吧。
7、异常处理支持多个 catch 语句。
8、NIO 库的一些改进,增加多重文件的支持、文件原始数据和符号链接。
被称为NIO2.0 ,NIO2.0由JSR-203演进而来
主要提供了如下三个方面的改进:
1 提供能够批量获取文件属性的API,这此API具有平台无关性,不与特性的文件系统相耦合,另外它还提供了标准文件
系统的SPI,供务个服务提供商扩展实现;
2提供AIO功能,支持基于文件的异步I/O操作和针对网络接字的异步操作
3完成JSR-51定义的通道功能,包括对配置和多播数据报的支持等
9、其他(更多是进一步的优化)。。。
Java 8(推荐版本)
2014 年,JavaSE8 发布,这个版本包含了之前本想在 JavaSE7 加入的,但由于时间仓促延迟发布的一些功能。
1、Lambda 表达式,简化代码(这个后面会专门写一篇文章介绍)。
2、注解功能的增强。重复注解和注解扩展,现在几乎可以为任何东西添加注解:局部变量、泛型类、父类与接口的实现,就连方法的异常也能添加注解。
3、新的时间和日期 API,在这之前 Java 的时间和日期库被投票为最难用的 API 之一,所以这个版本就改进了。
4、JavaFX,一种用在桌面开发领域的技术(也是和其他公司竞争,这个让我们拭目以待吧)。
5、静态链接 JNI 程序库(这个做安卓开发的同学应该熟悉)。
6、接口默认方法和静态方法
7、函数式接口
8、方法引用
9、java.util.stream
10、HashMap的底层实现有变化
11、JVM内存管理方面,由元空间代替了永久代。
区别:
- 元空间并不在虚拟机中,而是使用本地内存
- 默认情况下,元空间的大小仅受本地内存限制
- 也可以通过-XX:MetaspaceSize指定元空间大小
ps:详细讲解了jdk8中的各个新特性
Java 9
2017 年,Oracle 发布 JavaSE9(这个版本的功能早在 2011 年的 JavaOne 大会中就讨论了),这个版本目前也还在更新中,一些新功能就简要介绍一下。
1、模块化(这点也是向其他语言学习的,如 JavaScript)。
2、Java Shell(这点也是向其他语言学习的,如 Python),在这之前总有人说 Java 太麻烦,写个 Hello Word 都要新建个类,有时候测试个几行的代码都不方便,Java Shell 推出后,Java 开发者不用眼馋其他语言的 Shell 了,你可以向下面图中这样写 Java 的 Hello Word 了(我的电脑上装了 Java 6、7、8、9、10 ,准备集齐七个版本召唤 Java 神龙,txtx~)。
3、即时编译功能的增强。
4、XML Catalogs ,XML 文件自动校验。
5、一些还在开发路上的功能。。。
Java10
- 局部变量类型推断(Local-Variable Type Inference)
//之前的代码格式 URL url = new URL("http://www.oracle.com/"); URLConnection conn = url.openConnection(); Reader reader = new BufferedReader( new InputStreamReader(conn.getInputStream())) //java10中用var来声明变量 var url = new URL("http://www.oracle.com/"); var conn = url.openConnection(); var reader = new BufferedReader( new InputStreamReader(conn.getInputStream()));var
是一个保留类型名称,而不是关键字。所以之前使用var
作为变量、方法名、包名的都没问题,但是如果作为类或接口名,那么这个类和接口就必须重命名了。var
的使用场景主要有以下四种:
- 本地变量初始化。
- 增强for循环中。
- 传统for循环中声明的索引变量。
- Try-with-resources 变量。
Optional
类添加了新的方法orElseThrow
。相比于已经存在的get方法,这个方法更推荐使用。
Java11
- 支持Unicode 10.0,在jdk10中是8.0。
- 标准化HTTP Client
- 编译器线程的延迟分配。添加了新的命令-XX:+UseDynamicNumberOfCompilerThreads动态控制编译器线程的数量。
- 新的垃圾收集器—ZGC。一种可伸缩的低延迟垃圾收集器(实验性)。
- Epsilon。一款新的实验性无操作垃圾收集器。Epsilon GC 只负责内存分配,不实现任何内存回收机制。这对于性能测试非常有用,可用于与其他GC对比成本和收益。
- Lambda参数的局部变量语法。java10中引入的var字段得到了增强,现在可以用在lambda表达式的声明中。如果lambda表达式的其中一个形式参数使用了var,那所有的参数都必须使用var。
java12
1、低暂停的垃圾收集器-Shenandoah
2、默认CDS归档
通过在64位平台上的默认类列表的帮助下生成CDS归档来改进JDK构建过程,从而有效地消除了运行java -Xshare:dump。 此功能的目标包括:1。)改进开箱即用的启动时间,以及2.)摆脱使用-Xshare:dump。
3、Shenandoah GC
Shenandoah是一种垃圾收集(GC)算法,旨在保证低延迟(10 - 500 ms的下限)。 它通过在运行Java工作线程的同时执行GC操作减少GC暂停时间。 使用Shenandoah,暂停时间不依赖于堆的大小。 这意味着无论堆的大小如何,暂停时间都是差不多的。这是一个实验性功能,不包含在默认(Oracle)的OpenJDK版本中。
4、JMH 基准测试
此功能为JDK源代码添加了一套微基准测试(大约100个),简化了现有微基准测试的运行和新基准测试的创建过程。 它基于Java Microbenchmark Harness(JMH)并支持JMH更新。此功能使开发人员可以轻松运行当前的微基准测试并为JDK源代码添加新的微基准测试。 可以基于Java Microbenchmark Harness(JMH)轻松测试JDK性能。 它将支持JMH更新,并在套件中包含一组(约100个)基准测试。
5、JVM 常量 API
JEP 334引入了一个API,用于建模关键类文件和运行时artifacts,例如常量池。 此API将包括ClassDesc,MethodTypeDesc,MethodHandleDesc和DynamicConstantDesc等类。此 API 对于操作类和方法的工具很有帮助。
6、G1的可中断 mixed GC
此功能通过将Mixed GC集拆分为强制部分和可选部分,使G1垃圾收集器更有效地中止垃圾收集过程。通过允许垃圾收集过程优先处理强制集,g1可以更多满足满足暂停时间目标。G1是一个垃圾收集器,设计用于具有大量内存的多处理器机器。由于它提高了性能效率,g1垃圾收集器最终将取代cms垃圾收集器。G1垃圾收集器的主要目标之一是满足用户设置的暂停时间。G1采用一个分析引擎来选择在收集期间要处理的工作量。此选择过程的结果是一组称为GC集的区域。一旦GC集建立并且GC已经开始,那么G1就无法停止。如果G1发现GC集选择选择了错误的区域,它会将GC区域的拆分为两部分(强制部分和可选部分)来切换到处理Mix GC的增量模式。如果未达到暂停时间目标,则停止对可选部分的垃圾收集。
7、G1归还不使用的内存
此功能的主要目标是改进G1垃圾收集器,以便在不活动时将Java堆内存归还给操作系统。 为实现此目标,G1将在低应用程序活动期间定期生成或持续循环检查完整的Java堆使用情况。这将立即归还未使用的部分Java堆内存给操作系统。 用户可以选择执行FULL GC以最大化返回的内存量。
8、移除多余ARM64实现
Java 12将只有一个ARM 64位实现(aarch64)。 目标是删除所有与arm64实现相关的代码,同时保留32位ARM端口和64位aarch64实现。这将把重点转移到单个64位ARM实现,并消除维护两个实现所需的重复工作。 当前的JDK 11实现中有两个64位ARM实现。