JDK各个版本的区别

JDK各个版本的区别

原地址:https://blog.csdn.net/papima/article/details/78219001html

jdk1.5的新特性:java


1. 泛型
   ArrayList list=new ArrayList()------>ArrayList<Integer>list=new ArrayList<Integer>();正则表达式


2 自动装箱/拆箱
   nt i=list.get(0).parseInt();-------->int i=list.get(0);原始类型与对应的包装类不用显式转换shell


3 for-each
   i=0;i<a.length;i++------------>for(int i:a){......}编程


4 static import
   Math.sqrt();--------------->sqrt();api


5 变长参数
   int sum(int ...intlist)有任意个参数,把他看做数组


jdk1.6的新特性数组


1.加强的for循环语句
Integer[] numbers = computeNumbers();
for (int i=0; i < numbers.length ; i++)
sum += numbers[i];
||
int sum = 0;
for ( int number: computeNumbers() )
sum += number;安全


2.监视和管理
Java SE 6中对内存泄漏加强了分析以及诊断能力。当遇到java.lang.OutOfMemory异常的时候,能够获得一个完整的堆栈信息,
而且当堆已经满了的时候,会产生一个Log文件来记录这个致命错误。另外,JVM还添加了一个选项,容许你在堆满的时候运行脚本。多线程


3.插入式注解处理
插入式注解处理API(JSR 269)提供一套标准API来处理Annotations并发


4.安全性


jdk1.7的新特性
1.模块化特性
Java7也是采用了模块的划分方式来提速,一些不是必须的模块并无下载和安装,当虚拟机须要的时候,再下载相应的模块,
同时对启动速度也有了很大的改善。


2.多语言支持
Java7的虚拟机对多种动态程序语言增长了支持,好比:Rubby、 Python等等。


3.开发者的开发效率获得了改善
switch中可使用字符串
在多线程并发与控制方面:轻量级的分离与合并框架,一个支持并发访问的HashMap等等。
经过注解加强程序的静态检查。
提供了一些新的API用于文件系统的访问、异步的输入输出操做、Socket通道的配置与绑定、多点数据包的传送等等。


4.执行效率的提升
对对象指针由64位压缩到与32位指针相匹配的技术使得内存和内存带块的消耗获得了很大的下降于是提升了执行效率。
提供了新的垃圾回收机制(G1)来下降垃圾回收的负载和加强垃圾回收的效果。

 

JDK1.8的新特性 
1、接口的默认方法
Java 8容许咱们给接口添加一个非抽象的方法实现,只须要使用 default关键字便可,这个特征又叫作扩展方法。

2、Lambda 表达式
在Java 8 中你就不必使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
Collections.sort(names, (String a, String b) -> {

    return b.compareTo(a);

});

3、函数式接口
Lambda表达式是如何在java的类型系统中表示的呢?每个lambda表达式都对应一个类型,一般是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每个该类型的lambda表达式都会被匹配到这个抽象方法。由于 默认方法 不算抽象方法,因此你也能够给你的函数式接口添加默认方法。 

4、方法与构造函数引用
Java 8 容许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展现了如何引用一个静态方法,咱们也能够引用一个对象的方法:
converter = something::startsWith;

String converted = converter.convert("Java");

System.out.println(converted);

5、Lambda 做用域
在lambda表达式中访问外层做用域和老版本的匿名对象中的方式很类似。你能够直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。

6、访问局部变量
能够直接在lambda表达式中访问外层的局部变量:

7、访问对象字段与静态变量 
和本地变量不一样的是,lambda内部对于实例的字段以及静态变量是便可读又可写。该行为和匿名对象是一致的:

8、访问接口的默认方法
JDK 1.8 API包含了不少内建的函数式接口,在老Java中经常使用到的好比Comparator或者Runnable接口,这些接口都增长了@FunctionalInterface注解以便能用在lambda上。
Java 8 API一样还提供了不少全新的函数式接口来让工做更加方便,有一些接口是来自Google Guava库里的,即使你对这些很熟悉了,仍是有必要看看这些是如何扩展到lambda上使用的。
 

JDK1.9 新特性

java 7 2011发布,Java 8 2014发布,java9发布于2017年9月21日。 你可能已经据说过 Java 9 的模块系统,可是这个新版本还有许多其它的更新。 这里有九个使人兴奋的新功能将与 Java 9 一块儿发布。

1. Java 平台级模块系统

Java 9 的定义功能是一套全新的模块系统。当代码库愈来愈大,建立复杂,盘根错节的“意大利面条式代码”的概率呈指数级的增加。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并无对不一样部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每个公共类均可以被类路径之下任何其它的公共类所访问到, 这样就会致使无心中使用了并不想被公开访问的 API。此外,类路径自己也存在问题: 你怎么知晓全部须要的 JAR 都已经有了, 或者是否是会有重复的项呢? 模块系统把这俩个问题都给解决了。

模块化的 JAR 文件都包含一个额外的模块描述器。在这个模块描述器中, 对其它模块的依赖是经过 “requires” 来表示的。另外, “exports” 语句控制着哪些包是能够被其它模块访问到的。全部不被导出的包默认都封装在模块的里面。以下是一个模块描述器的示例,存在于 “module-info.java” 文件中:
咱们能够以下展现模块:

请注意,两个模块都包含封装的包,由于它们没有被导出(使用橙色盾牌可视化)。 没有人会偶然地使用来自这些包中的类。Java 平台自己也使用本身的模块系统进行了模块化。经过封装 JDK 的内部类,平台更安全,持续改进也更容易。

当启动一个模块化应用时, JVM 会验证是否全部的模块都能使用,这基于 `requires` 语句——比脆弱的类路径迈进了一大步。模块容许你更好地强制结构化封装你的应用并明确依赖。你能够在这个课程中学习更多关于 Java 9 中模块工做的信息 。

 

2. Linking

当你使用具备显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块如今将声明其对其余应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为何不使用这些信息建立一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这能够经过 Java 9 中的新的 jlink 工具实现。你能够建立针对应用程序进行优化的最小运行时映像而不须要使用彻底加载 JDK 安装版本。

 

3. JShell : 交互式 Java REPL

许多语言已经具备交互式编程环境,Java 如今加入了这个俱乐部。您能够从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。

测试一个 Java 正则表达式是一个很好的说明 jshell 如何使您的生活更轻松的例子。 交互式 shell 还能够提供良好的教学环境以及提升生产力,您能够在此了解更多信息。在教人们如何编写 Java 的过程当中,再也不须要解释 “public static void main(String [] args)” 这句废话。

 

4. 改进的 Javadoc

有时一些小事情能够带来很大的不一样。你是否就像我同样在一直使用 Google 来查找正确的 Javadoc 页面呢? 这再也不须要了。Javadoc 如今支持在 API 文档中的进行搜索。另外,Javadoc 的输出如今符合兼容 HTML5 标准。此外,你会注意到,每一个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。

5. 集合工厂方法

一般,您但愿在代码中建立一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:

1

2

  1. Set<Integer>

  2. ints = Set.of(

1,2,3);
  1. List<String>

  2. strings = List.of(

"first","second");

除了更短和更好阅读以外,这些方法也能够避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,由于它们是不可变的:在建立后,继续添加元素到这些集合会致使 “UnsupportedOperationException” 。

 

6. 改进的 Stream API

长期以来,Stream API 都是 Java 标准库最好的改进之一。经过这套 API 能够在集合上创建用于转换的申明管道。在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可让你提供一个 Predicate (判断条件)来指定何时结束迭代:

第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。所以这个简单的示例是向控制台打印 1 到 99。

除了对 Stream 自己的扩展,Optional 和 Stream 之间的结合也获得了改进。如今能够经过 Optional 的新方法 `stram` 将一个 Optional 对象转换为一个(多是空的) Stream 对象:

在组合复杂的 Stream 管道时,将 Optional 转换为 Stream 很是有用。

 

7. 私有接口方法

Java 8 为咱们带来了接口的默认方法。 接口如今也能够包含行为,而不只仅是方法签名。 可是,若是在接口上有几个默认方法,代码几乎相同,会发生什么状况? 一般,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码建立为一个默认方法不是一个解决方案,由于该辅助方法会成为公共API的一部分。 使用 Java 9,您能够向接口添加私有辅助方法来解决此问题:

若是您使用默认方法开发 API ,那么私有接口方法可能有助于构建其实现。

 

8. HTTP/2

Java 9 中有新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。不过你能够在 Java 9 中开始使用这套 API:

1

2

3

4

5

6

7

8

9

10

HttpClient client = HttpClient.newHttpClient();

 

HttpRequest req = HttpRequest.newBuilder(URI.create("http://www.google.com"))

              .header("User-Agent","Java")

              .GET()

              .build();

 

 

HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
除了这个简单的请求/响应模型以外,HttpClient 还提供了新的 API 来处理 HTTP/2 的特性,好比流和服务端推送。

 

9. 多版本兼容 JAR

咱们最后要来着重介绍的这个特性对于库的维护者而言是个特别好的消息。当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多状况下就是 Java 6 或者 7)。这实际上意味着将来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你建立仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:

在上述场景中, multirelease.jar 能够在 Java 9 中使用, 不过 Helper 这个类使用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 准备的 class 版本,能够运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,由于较老版本的 Java 只会看到顶层的这个 Helper 类。

 

JDK10特性

1. 局部变量类型推断

局部变量类型推断能够说是Java 10中最值得注意的特性,这是Java语言开发人员为了简化Java应用程序的编写而采起的又一步,以下图所示。

这个新功能将为Java增长一些语法糖 - 简化它并改善开发者体验。新的语法将减小与编写Java相关的冗长度,同时保持对静态类型安全性的承诺。

局部变量类型推断将引入"var"关键字,也就是你能够随意定义变量而没必要指定变量的类型,如:

将被下面这个新语法所取代:

看完是否是有点JS的即视感???愈来愈像JS了吗?!虽然类型推断在Java中不是一个新概念,但在局部变量中确是很大的一个改进。

说到类型推断,从JDK 5引进泛型,到JDK 7的"<>"操做符容许不绑定类型而初始化List,再到JDK 8的Lambda表达式,再到如今JDK 10的局部变量类型推断,Java类型推断正大刀阔斧的向前发展。

局部变量类型推荐仅限于以下使用场景:

局部变量初始化for循环内部索引变量传统的for循环声明变量Java官方表示,它不能用于如下几个地方:

方法参数构造函数参数方法返回类型字段捕获表达式(或任何其余类型的变量声明)

 

2. GC改进和内存管理

JDK 10中有2个JEP专门用于改进当前的垃圾收集元素。

第一个垃圾收集器接口是(JEP 304),它将引入一个纯净的垃圾收集器接口,以帮助改进不一样垃圾收集器的源代码隔离。

预约用于Java 10的第二个JEP是针对G1的并行彻底GC(JEP 307),其重点在于经过彻底GC并行来改善G1最坏状况的等待时间。G1是Java 9中的默认GC,而且此JEP的目标是使G1平行。

 

3. 线程本地握手(JEP 312)

JDK 10将引入一种在线程上执行回调的新方法,所以这将会很方便能中止单个线程而不是中止所有线程或者一个都不停。

 

4. 备用内存设备上的堆分配(JEP 316)

容许HotSpot VM在备用内存设备上分配Java对象堆内存,该内存设备将由用户指定。

 

5. 其余Unicode语言 - 标记扩展(JEP 314)

目标是加强java.util.Locale及其相关的API,以便实现语言标记语法的其余Unicode扩展(BCP 47)。

 

6. 基于Java的实验性JIT编译器

Oracle但愿将其Java JIT编译器Graal用做Linux / x64平台上的实验性JIT编译器。

 

7. 根证书(JEP 319)

这个的目标是在Oracle的Java SE中开源根证书。

 

8. 根证书颁发认证

这将使OpenJDK对开发人员更具吸引力,它还旨在减小OpenJDK和Oracle JDK构建之间的差别。

 

9. 将JDK生态整合单个存储库(JEP 296)

此JEP的主要目标是执行一些内存管理,并将JDK生态的众多存储库组合到一个存储库中。

 

10. 删除工具javah(JEP 313)

从JDK中移除了javah工具,这个很简单而且很重要。

 

Java 10尝鲜

尝鲜地址:http://openjdk.java.net/projects/jdk/10/

相关文章
相关标签/搜索