【汇总】Java 7, 8 ,9 , 10的新增特性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TTKatrina/article/details/79646874

Java 7的那些语法糖

http://blog.csdn.net/chenleixing/article/details/47802653

1.switch可以接受string类型而不像以前仅仅是int;
2.异常catch可以一次处理完而不像以前一层层的surround;
3.泛型类实例化也不用繁琐的将泛型声明再写一遍;
4.文件读写 会自动关闭流而不像以前那样需要在finally中显式close;
5.数值可以使用下划线分隔;
6.文件读写功能增强,有更简单的api调用;(Path path = Paths.get(“c:\Temp\temp”); Files.deleteIfExists(path); )
7.文件改变的事件通知功能;(watchService = FileSystems.getDefault().newWatchService())
8.多核 并行计算的支持加强 fork join 框架;(ForkJoinPool pool = new ForkJoinPool(numberOfProcessors); )
9.还有一些动态特性的加入。(java.lang.invoke 包的引入。 MethodHandle, CallSite 还有一些其他类供使用。)


Java8新特性详解

本段小结摘自这里:
http://blog.csdn.net/cdw8131197/article/details/68553148
但这篇总结更精彩和深入:
java8新特性详解

1.接口的默认方法,在接口中新增了default方法和static方法,这两种方法可以有方法体;接口里的静态方法,即static修饰的有方法体的方法不会被继承或者实现,但是静态变量会被继承。结论:接口中的static方法不能被继承,也不能被实现类调用,只能被自身调用。default方法可以被子接口继承亦可被其实现类所调用;default方法被继承时,可以被子接口覆写
2.Lambda表达式可以看成是匿名内部类,使用Lambda表达式时,接口必须是函数式接口;
基本语法:

 <函数式接口>  <变量名> = (参数1,参数2...) -> {
                    //方法体
        }
说明: 
(参数1,参数2…)表示参数列表;->表示连接符;{}内部是方法体 
1、=右边的类型会根据左边的函数式接口类型自动推断; 
2、如果形参列表为空,只需保留(); 
3、如果形参只有1个,()可以省略,只需要参数的名称即可; 
4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句; 
5、形参列表的数据类型会自动推断; 
6、lambda不会生成一个单独的内部类文件; 
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;

3.如果一个接口只有一个抽象方法,则该接口称之为函数式接口,因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
函数式接口可以使用Lambda表达式,lambda表达式会被匹配到这个抽象方法上 ;
我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加@FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的
5.作用域:在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
6.我们可以直接在lambda表达式中访问外层的局部变量,但是该局部变量必须是final的,即使没有加final关键字,之后我们无论在哪(lambda表达式内部或外部)修改该变量,均报错。
7.访问对象字段与静态变量,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的;
8.访问接口的默认方法:Predicate接口,Function接口,Supplier接口,Consumer 接口,Comparator 接口,Optional 接口。
Stream 接口 重要!!!创建stream–通过of方法, 通过generator方法。
9.Date API: Java 8 在包java.time下包含了一组全新的时间日期API。Clock时钟,Timezones时区,LocalTime本地时间,LocalDate本地日期,LocalDateTime 本地日期时间 。DayOfWeek… 只要附加上时区信息,就可以将其转换为一个时间点Instant对象,Instant时间点对象可以很容易的转换为老式的java.util.Date。
10.Annotation 注解
在Java 8中支持多重注解了

Lambda表达式其他特性:
1、引用实例方法

    <函数式接口>  <变量名> = <实例>::<实例方法名>
    //调用
    <变量名>.接口方法([实际参数...])

2、引用类方法

    <函数式接口>  <变量名> = <类>::<类方法名称>
    //调用
    <变量名>.接口方法([实际参数...])

3、引用类的实例方法

    //定义接口
    interface <函数式接口>{
        <返回值> <方法名>(<类><类名称>,[其他参数...]); 
    }
    <函数式接口>  <变量名> = <类>::<类实例方法名>
    //调用
    <变量名>.接口方法(类的实例,[实际参数...])

4、引用构造器方法

    <函数式接口>  <变量名> = <类>::<new>
    //调用
    <变量名>.接口方法([实际参数...])

java.util.Function包下都是函数式接口,我们可以直接拿来使用:


Java9新特性

http://developer.51cto.com/art/201801/564443.htm

modularity System 模块系统

Java 9中主要的变化是已经实现的模块化系统。

Modularity提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节,Java提供该功能的主要的动机在于,减少内存的开销,在JVM启动的时候,至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class。

在引入了模块系统之后,JDK 被重新组织成 94 个模块。Java 应用可以通过新增的 jlink 工具,创建出只包含所依赖的 JDK 模块的自定义运行时镜像。这样可以极大的减少 Java 运行时环境的大小。使得JDK可以在更小的设备中使用。采用模块化系统的应用程序只需要这些应用程序所需的那部分JDK模块,而非是整个JDK框架了。

HTTP/2

JDK9之前提供HttpURLConnection API来实现Http访问功能,但是这个类基本很少使用,一般都会选择Apache的Http Client,此次在Java 9的版本中引入了一个新的package:java.net.http,里面提供了对Http访问很好的支持,不仅支持Http1.1而且还支持HTTP2(什么是HTTP2?请参见HTTP2的时代来了…),以及WebSocket,据说性能特别好。

这里写图片描述

注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。

JShell

用过Python的童鞋都知道,Python 中的读取-求值-打印循环( Read-Evaluation-Print Loop )很方便。它的目的在于以即时结果和反馈的形式。

java9引入了jshell这个交互性工具,让Java也可以像脚本语言一样来运行,可以从控制台启动 jshell ,在 jshell 中直接输入表达式并查看其执行结果。当需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用。

除了表达式之外,还可以创建 Java 类和方法。jshell 也有基本的代码完成功能。我们在教人们如何编写 Java 的过程中,不再需要解释 “public static void main(String [] args)” 这句废话。

不可变集合工厂方法

Java 9增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法来创建不可变集合。

多版本兼容 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 类。

统一 JVM 日志

Java 9 中 ,JVM 有了统一的日志记录系统,可以使用新的命令行选项-Xlog 来控制 JVM 上 所有组件的日志记录。该日志记录系统可以设置输出的日志消息的标签、级别、修饰符和输出目标等。

Java 9 的垃圾收集机制

Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合,同时把G1设为默认的垃圾回收器实现。替代了之前默认使用的Parallel GC,对于这个改变,evens的评论是酱紫的:这项变更是很重要的,因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能

I/O 流新特性

java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据。

readAllBytes:读取 InputStream 中的所有剩余字节。
readNBytes: 从 InputStream 中读取指定数量的字节到数组中。
transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中 。


Java10

Java 10的10个新特性,将彻底改变你写代码的方式!

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尝鲜

就像所有其他JDK版本一样,Oracle已经发布了一个Java 10初始候选版本,Java开发者可以下载此版本用来测试新功能。如果你对Java 10抱有期待想提早尝试,那么现在就开始吧!

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

最后的一点想法

对于第一点新特性来说确实是一个大的跨越,其他特性或多或少都能带给开发者福音。但最终Java 10会是什么样,或许还会增加更多实用性的新功能或者优化,我们还得期待!

现在要做的就是,赶紧熟悉JDK 8,现在已经是很多互联网企业标配了。如果还在使用JDK4-7,那真的是要OUT了。。

阅读更多

没有更多推荐了,返回首页