首页 / 互联网 / 正文
聊聊Java8 以后各个版本的新特性
櫻羽 发表于:2019-9-3 15:05:30 复制链接 看图 发表新帖
阅读数:4616

下载APP可以快速和圈友联系

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本文作者

作者:ZY

本文转载自ZYLAB公众号。

某天在网上闲逛,忽然看到有篇先容 Java 11 新特征的文章,顿时心里一惊,究竟我对于 Java 的版本熟悉还逗留在 Java 8 上,而平常利用的语法和 API 还逗留在 Java 7 上。因而抽时候看了看 Java 8 今后各个版本的特征,做了一个总结。

文章概览

聊聊Java8 今后各个版本的新特征-1.png


JDK

JDK 全称 Java Development Kit,是 Java 开辟情况。我们凡是所说的 JDK 指的是 Java SE (Standard Edition) Development Kit。除此之外还有 Java EE(Enterprise Edition)和 Java ME(Micro Edition platforms)。

Java 的公布周期

聊聊Java8 今后各个版本的新特征-2.png


下面我们看一些 Java 成长进程中重要的节点。

1995 年 alpha 和 beta Java 公然版本公布,取名为 WebRunner。

1996.1.23 Java 第一个版本公布,取名叫 Oak。可是第一个稳定版本是 JDK 1.0.2,被称做Java 1

1998.12.8 公布了 J2SE 1.2。这个版本到 J2SE 5.0 更名为Java 2。其中的 SE 指的是 Standard Edition,为了区分于 J2EE(Enterprise Edition)和 J2ME(Micro Edition)。

2000.5 公布了 J2SE 1.3,其中包括了HotSpot JVM。而 HotSpot JVM 初次公布是在 1999.4,名为 J2SE 1.2 JVM。

2004.9.30 公布了J2SE 5.0。为什么这个版本命名和前面几个版本纷歧样呢?这个版本原本计划以 1.5 命名的,相沿之前的命名方式。可是为了更好的反应这个版本的成熟度,所以更名为 5.0。

这个版本今后,有了一个新的版本控制系统,5.0 用来暗示产物版本,用来暗示稳定的 J2SE 版本,而 1.5.0 用来暗示开辟者版本,也就是 Java 5.0 = JDK 1.5.0。

2006.12.11,J2SE更名为 Java SE,版本号去掉了 .0。尔后对应版本就是 Java 6 = JDK 1.6,Java 7 = JDK 1.7。

2011.7.7. 公布 Java SE 7,是一个严重版本更新。更新了众多特征。

2019.3 公布 Java SE 10。在此之前,Java 根基上是两年一个版本,除了 Java SE 7 经过了五年,Java SE 8 经过了三年。在此以后,就是每六个月公布一次新版本。能够否是每个版本都是 LTS(Long-Term-Support)。依照 Oracle 的计划,每三年会有一个 LTS 版本。比来的 LTS 版本就是 Java SE 11 了。

OpenJDK VS Oracle JDK

OpenJDK 是 在 2007 年由 Sun Corporation(现在的Oracle Corporation) 公布的。是 Oracle JDK 的开源实现版本,以 GPL 协议公布。

在 JDK 7 的时辰,Sub JDK 就是在 Open JDK 7 的根本上公布的,只替换了少许的源码。在 Sun 公司被 Oracle 收买今后,Sun SDK 就被称为 Oracle JDK。

Oracle JDK 是基于 Oracle Binary COde License Agreement 协议。

两者的区分以下:

    Oracle JDK 将三年公布一次稳定版本,OpenJDK 每三个月公布一次。Oracle JDK 支持 LTS,OpenJDK 只支持当前版本至下一个版本公布。Oracle JDK 采用 Oracle Binary Code License 协议,OpenJDK 采用 GPL v2 协议。Oracle JDK 基于 OpenJDK 构建,技术上根基没有差别。
Android 和 JDK

说起 Android 和 OpenJDK 的历史渊源,还是稍微复杂。简单来说,Android 最起头利用的 Java 是基于 Apache 协议公布的 Harmony,后出处于 Harmony 自己的限制和 Oracle 公司的起诉,从 Android N 今后, Google 起头利用 OpenJDK。然后我们再稍微展开聊聊。

JVM 和 TCK

Sun 公司最初开辟了 Java 说话,同时也开辟了 JVM,而且界说了 JVM 标准。这个我们比力清楚,只要基于 JVM 标准开辟自己的说话,便可以运转在 JVM 上。

可是依照标准开辟了说话以后,需要经过 Sun 的 TCK(Technology Compatibility Kit)测试,以后才能成为官方认可的 JVM 说话。

Harmony 和 OpenJDK

基于 JVM 标准,Apache 开辟了一个开源免费的 Java 实现 Harmony,而且按照 Apache License v2 公布。可是 Sun 公司并没有给 Harmony TCK 答应。

在 2009.4.15 Sun 公司公布了 OpenJDK,基于 GNU GPL 公布。同时 Sun 公司规定只要衍生自 OpenJDK 采用的 GPL 协议的开源实现才能运转 OpenJDK 的 TCK。以后 Oracle 收买 Sun 公司今后接收了 OpenJDK。

由于 Apache 的 Harmony 是 Apache 协议,与 OpenJDK 的 GPL 协议不兼容,所以 Harmony 一向没有获得 TCK 授权。

Android 最起头是采用了 Harmony 作为自己的 Java 类库,由于 Harmony 利用的 Apache 协议更自在。而由于 Harmony 没有经过 TCK 认证,也为后来 Oracle 起诉 Google 埋下伏笔。

Oracle 和 Google 关于 JDK 胶葛

后来 Oracle 起诉 Google 首要集合在两点,一是 Oracle 以为 Google 代码中利用了 Java 的 37 个 API,二是 Sun 公司前员工在跳槽后为 Android 项目开辟时,间接复制了 OpenJDK 中的九行代码,而 Android 项目并没有依照 GPL 协议授权,所以复制 OpenJDK 代码是没有经过 GPL 授权的。

所以到后来为领会决专利的题目,Android N 今后,Android 起头利用 OpenJDK 替换 Harmony。

以上 Android 和 JDK 参考材料:

https://juejin.im/entry/5abc516b518825556f557f90

https://zh.wikipedia.org/zh/Android#与甲骨文公司的Java胶葛

https://gudong.name/2019/04/05/android-why-java-harmony.html

聊了一些关于 Java 的历史,下面我们看看各个 Java 版本有那些新特征。这里只列出了对开辟者影响比力大的一些特征~

Java 8

1. Lambda 表达式 和 函数式接口

Lambda 表达式相信不用再过量的先容,终究在 Java 8 引入了,可以极大的削减代码量,代码看起来更清新。

函数式接口就是有且唯一一个笼统方式,可是可以有多个非笼统方式的接口。可以隐式转化为 Lambda 表达式。我们界说一个函数式接口以下:

@FunctionalInterfaceinterfaceOperation{intoperation(inta, intb);}再界说一个 Class 用来操纵 Operation 接口。

classTest{privateintoperate(inta, intb, Operation operation){returnoperation.operation(a, b);}}Test test = newTest;

在 Java 8 之前,我们想要实现 Operation 接口并传给 Test.operate 方式利用,我们要界说一个匿名类,实现 Operation 方式。

test.operate(1, 2, newOperation {@Overridepublicintoperation(inta, intb){returna + b;}});而利用 Lambda 表达式,我们便可以这样写了:

test.operate(1, 2, (a, b) -> a+ b);2. 方式援用

经过方式援用,可以利用方式的名字来指向一个方式。利用一对冒号来引 "::" 用方式。还是以上面的例子来看,我们再增加几个方式:

@FunctionalInterfaceinterfaceOperation{intoperation(inta, intb);}interfaceCreater<T> {T get;}

interfaceTestInt{intcp(Test test1, Test test2);}

classTest{publicstaticTest create(Creater<Test> creater){returncreater.get;}

privateintoperate(inta, intb, Operation operation){returnoperation.operation(a, b);}

privatestaticintadd(inta, intb){returna + b;}

privateintsub(inta, intb){returna - b;}

publicinttestM(Test test){return0;}

publicvoidtest(TestInt testInt){Test t1 = Test.create(Test::new); Test t2 = Test.create(Test::new);testInt.cp(t1, t2);}}

那末对应的方式援用有四种:

机关方式援用

利用方式:Class::new

Test test = Test.create(Test::new);静态方式援用

利用方式:Class::staticMethod

test.operate(1, 2, Test::add);工具的实例方式援用

利用方式:instance::method

test.operate(1, 2, test::sub);类的实例方式援用

利用方式:Class::method

test.test(Test::testM);实在上面三种方式援用都好了解,最初类的实例方式援用,有两个条件:

    首先要满足实例方式,而不是静态方式Lambda 表达式的第一个参数会成为挪用实例方式的工具 按照这两点我们看上面的例子,test 方式接管一个 TestInt 实例,用 Lambda 表达式暗示就是 (Test t1, Test t2) -> res,而我们挪用 test 方式时传入的方式援用是 Test::testM,其参数也是一个 Test 实例,终极 test.test(Test::testM) 的挪用结果就是 t1.testM(t2)
3. 接口默许方式和静态方式

Java 8 新增了接口的默许实现,经过 default 关键字暗示。同时也可以供给静态默许方式。

publicinterfaceTestInterface{String test();// 接口默许方式defaultString defaultTest(){return"default";}

staticString staticTest(){return"static";}}

4. 反复注解

Java 8 支持了反复注解。在 Java 8 之前想实现反复注解,需要用一些方式来绕过限制。比以下面的代码。

@interfaceAuthor {Stringname;}@interfaceAuthors {Author[]value;}

@Authors({@Author(name="a"), @Author(name = "b")})class Article {}

而在 Java 8 中,可以间接用下面的方式。

@Repeatable(Authors.class)@interface Author {Stringname;}@interfaceAuthors {Author[]value;}

@Author(name= "a")@Author(name = "b")class Article {}

在剖析注解的时辰,Java 8 也供给了新的 API。

AnnotatedElement.getAnnotationsByType(Class<T>)5. 范例注解

Java 8 之前注解只能用在声明中,在 Java 8 中,注解可以利用在 任何地方。

@Author(name="a")privateObjectname = "";privateStringauthor = (@Author(name="a")String) name;6. 更好的范例揣度

Java 8 对于范例揣度做了改良。

比如在 Java 7 中下面的写法:

List<String> stringList = newArrayList<>;stringList.add("A");stringList.addAll(Arrays.<String>asList);在 Java 8 中改良后的写法,可以自动做范例揣度。

List<String> stringList = newArrayList<>;stringList.add("A");stringList.addAll(Arrays.asList);7. Optional

Java 8 中新增了 Optional 类用来处理空指针异常。

Optional 是一个可以保存 null 的容器工具。经过 isPresent 方式检测值能否存在,经过 get 方式返回工具。

除此之外,Optional 还供给了很多其他有用的方式,具体可以检察 https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html。下面是一些示例代码。

// 建立一个 String 范例的容器Optional<String> str = Optional.of("str");// 值能否存在boolean pre = str.isPresent;// 值假如存在就挪用 println 方式,这里传入的是 println 的方式援用str.ifPresent(System.out::println);// 获得值Stringres = str.get;// 传入空值str = Optional.ofNullable(null);// 假如值存在,返回值,否则返回传入的参数res = str.orElse("aa");str = Optional.of("str");// 倘使有值,对其挪用映照函数获得返回值,对返回值停止 Optional 包装并返回res = str.map(s -> "aa"+ s).get;// 返回一个带有映照函数的 Optional 工具res = str.flatMap(s -> Optional.of(s + "bb")).flatMap(s -> Optional.of(s + "cc")).get;8. Stream

Java 8 中新增的 Stream 类供给了一种新的数据处置方式。这类方式将元素调集看做一种流,在管道中传输,经过一系列处置节点,终极输出成果。

关于 Stream 供给的具体方式,可以参照 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html。下面是一些示例代码。

List<String> list= Arrays.asList("maa", "a", "ab", "c");list.stream.filter(s -> s.contains("a")).map(s -> s + "aa").sorted.forEach(System.out::println);System.out.println("####");list.parallelStream.forEach(System.out::println);

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);int res = numbers.stream.map(i -> i + 1).mapToInt(i -> i).summaryStatistics.getMax;System.out.println(res);

9. 日期时候 API

Java 8 中新增了日期时候 API 用来增强对日期时候的处置,其中包括了 LocalDate,LocalTime,LocalDateTime,ZonedDateTime 等等。

关于 API 可以参照 https://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html 以及这篇 https://www.cnblogs.com/muscleape/p/9956754.html,写的很具体。

下面是示例代码。

LocalDate now = LocalDate.now;System.out.println(now);System.out.println(now.getYear);System.out.println(now.getMonth);System.out.println(now.getDayOfMonth);LocalTime localTime = LocalTime.now;System.out.println(localTime);LocalDateTime localDateTime = now.atTime(localTime);System.out.println(localDateTime);

10. Base64 支持

Java 8 标准库中供给了对 Base 64 编码的支持。具体 API 见可参照 https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html。下面是示例代码。

String base64 = Base64.getEncoder.encodeToString("aaa".getBytes);System.out.println(base64);byte[] bytes = Base64.getDecoder.decode(base64);System.out.println(newString(bytes));11. 并行数组 ParallelSort

Java 8 中供给了对数组的并行操纵,包括 parallelSort 等等,具体可参照 https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html。

Arrays.parallelSort(newint[] {1, 2, 3, 4, 5});12. 其他新特征

    对并发的增强 在java.util.concurrent.atomic包中还增加了下面这些类:DoubleAccumulator DoubleAdder LongAccumulator LongAdder供给了新的 Nashorn java 引擎供给了 jjs,是一个赐与 Nashorn 的号令行工具,可以用来履行 Java 源码供给了新的类依靠分析工具 jdepsJVM 的新特征 JVM内存永久区已经被metaspace替换(JEP 122)。JVM参数 -XX:PermSize 和 –XX:MaxPermSize被XX:MetaSpaceSize 和 -XX:MaxMetaspaceSize取代。
可以看到,Java 8 整体上的改良是很大的,最重要的是引入 Lambda 表达式,简化代码。

其他一些改良可参照 https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

Java 9

1. Jigsaw 模块化系统

在 Java 9 之前,打包和依靠都是基于 JAR 包停止的。JRE 中包括了 rt.jar,快要 63M,也就是说要运转一个简单的 Hello World,也需要依靠这么大的 jar 包。在 Java 9 中提出的模块化系统,对这点停止了改良。关于模块化系统具体可以看看这篇 https://zhuanlan.zhihu.com/p/24800180。

2. JShell REPL

Java 9 供给了交互式诠释器。有了 JShell 今后,Java 终究可以像 Python,Node.js 一样在 Shell 中运转一些代码并间接得出成果了。

3. 接口中利用私有接口方式

Java 9 中可以在接口中界说私有方式。示例代码以下:

publicinterfaceTestInterface{String test();// 接口默许方式defaultString defaultTest(){pmethod;return"default";}

privateString pmethod(){System.out.println("private method in interface");return"private";}}

4. 调集不成变实例工场方式

在之前,我们想要建立一个不成变的调集,需要先建立一个可变调集,然后利用 unmodifiableSet 建立不成变调集。代码以下:

Set<String> set= newHashSet<>;set.add("A");set.add("B");set.add("C");set= Collections.unmodifiableSet(set);System.out.println(set);

Java 9 中供给了新的 API 用来建立不成变调集。

List<String> list = List.of("A", "B", "C");Set<String> set = Set.of("A", "B", "C");Map<String, String> map = Map.of("KA", "VA", "KB", "VB");5. 改良 try-with-resources

Java 9 中不需要在 try 中额外界说一个变量。

Java 9 之前需要这样利用 try-with-resources:

InputStream inputStream = newStringBufferInputStream("a");try(InputStream in= inputStream) {in.read;} catch(IOException e) {e.printStackTrace;}在 Java 9 中可以间接利用 inputStream 变量,不需要再额外界说新的变量了。

InputStream inputStream = newStringBufferInputStream("a");try(inputStream) {inputStream.read;} catch(IOException e) {e.printStackTrace;}6. 多版本兼容 JAR 包

Java 9 中支持在同一个 JAR 中保护分歧版本的 Java 类和资本。

7. 增强了 Stream,Optional,Process API

8. 新增 HTTP2 Client

9. 增强了 JavaDoc

增加了 HTML 5 文档的输出,而且增加了搜索功用。

10. 增强 @Deprecated

对 Deprecated 新增了 since 和 forRemoval 属性。

11. 增强了钻石操纵符 <>,可以在匿名类中利用

在 Java 9 之前,内部匿名类需要指定泛型范例,以下:

Handler<? extends Number> intHandler1 = newHandler<Number>(2) {}而在 Java 9 中,可以自动做范例推导,以下:

Handler<? extends Number> intHandler1 = newHandler<>(2) {}12. 多分辨率图像 API

界说多分辨率图像API,开辟者可以很轻易的操纵和展现分歧分辨率的图像了。

13. 改良 CompletableFuture API

CompletableFuture 类的异步机制可以在 ProcessHandle.onExit 方式退出时履行操纵。

其他一些改良可参照 https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6

Java 10

1. 新增部分变量范例揣度 var

vara = "aa";System.out.println(a);var 关键字今朝只能用于部分变量以及 for 循环变量声明中。

2. 删除工具 javah

从JDK中移除了 javah 工具,利用 javac -h 取代。

3. 同一的渣滓接管接口,改良了 GC 和其他外务治理

4. 其他新特征

    ThreadLocal 握手交互 JDK 10 引入一种在线程上履行回调的新方式,很方便的停止单个线程而不是停止全数线程大概一个都不停。基于Java的尝试性JIT编译器 Java 10 开启了 Java JIT编译器 Graal,用作Linux / x64平台上的尝试性JIT编译器。供给默许的 CA 根证书将 JDK 生态整合到单个仓库 此JEP的首要方针是履行一些内存治理,并将JDK生态的众多存储库组合到一个存储库中。
其他一些改良可以参照 https://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html#NewFeature

Java 11

1. Lambda 表达式中利用 var

(varx, vary) -> x.process(y)2. 字符串 API 增强

Java 11 新增了 一系列字符串处置方式,例如:

// 判定字符串能否为空缺" ".isBlank;" Javastack ".stripTrailing; // " Javastack"" Javastack ".stripLeading; // "Javastack "3. 标准化 HTTPClient API

4. java 号令间接编译运转 java

省去中心步调 javac 天生 class 文件。

5. 增加对 TLS 1.3 的支持

其他一些改良可以参照 https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#NewFeature

Java 12

switch 表达式

Java 12 今后,switch 不但可以作为语句,也可以作为表达式。

privateString switchTest(inti){returnswitch(i) {case1-> "1";default-> "0";};}其他一些改良可以参照 https://www.oracle.com/technetwork/java/javase/12-relnote-issues-5211422.html#NewFeature

总结

聊聊Java8 今后各个版本的新特征-3.jpeg


参考材料

Java8

http://ifeve.com/java-8-features-tutorial/

https://juejin.im/post/5ae6bfb66fb9a07a9b35bac1#comment

https://wizardforcel.gitbooks.io/java8-tutorials/content/Java 8 新特征终极指南.html

https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

https://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html

Java9

http://www.runoob.com/java/java9-new-features.html

https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6

https://www.twle.cn/c/yufei/java9/java9-basic-process-manage-api.html

Java10

https://baijiahao.baidu.com/s?id=1594437679552808575&wfr=spider&for=pc

https://blog.csdn.net/visant/article/details/79778967

https://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html

Java 11

https://openjdk.java.net/projects/jdk/11/

https://www.ctolib.com/topics-135138.html

Java 12

https://zhuanlan.zhihu.com/p/59798800

其他

https://www.baeldung.com/oracle-jdk-vs-openjdk

https://zh.wikipedia.org/wiki/Java版本歷史

https://www.zhihu.com/question/19646618

https://juejin.im/post/5ca1c747e51d45761c7441fa

https://gudong.name/2019/04/05/android-why-java-harmony.html


上一篇:给我两分钟,让你秒懂Java是什么
下一篇:快手在哪个环节输给了抖音
温馨提示:
下载好向圈客户端可以随时随地交流学习经验,也可以和圈友发起聊天成为好友
好向圈www.kuaixunai.com是一个专业经验分享交流平台,请提供优质的经验内容分享,拒绝任何广告内容出现,低质量广告内容硬广包含手机号码,微信,QQ或者二维码,网址等形式存在可能会审核不通过 要想被各大搜索引擎尽快收录请做好内容原创工作,才会有更好的推广效果。
返回列表
使用道具 举报
#聊聊, #以后, #各个, #版本, #特性
条评论
您需要登录后才可以回帖 登录 | 立即注册
相关推荐
广告合作以及侵权投诉客服QQ:1623331347 江苏好向圈信息科技有限公司 网站地图1 网站地图2