怎么选择Java JDK(更新到OpenJDK 17)

不想细看的就选open LTS的版本就行,J2SE是标准版本,J2ME是手机方向的,J2EE是网站开发方向的,项目比较老就用JDK8,想用自动编译运行的就是JDK11以上,想紧跟潮流的就用JDK17

引入

现在是敏捷开发时代了,流行小迭代,Java现在的每六个月更新一次的发版频率就是小迭代。
Java开发团队可谓是“高产似母猪”,每隔几个月就冒出一个新版本出来,很多人对Java8都没有精通,但是Java11、12、13、14都已经发布了…
TMD用了这么久的IDEA都不知道空项目用哪个JDK

据说Java的不断迭代是从另一个角度证明了其火热程度,虽然这些变化让人头晕目眩,但其目的是为了给世界上最流行的语言提供高质量、频繁且在计划内的更新,同时让语言开发团队保持高度活跃,以便让程序员们更好地探索Java语言。JDK是个Java开发的工具包,Java是门编程语言。

但是这个对于我们学习者来说是如此的痛苦,找个项目有Java8写的,有Java11写的,每个项目的依赖包还不一样(还有的项目命名极其不规范,一个注释都不写,中国人不骗中国人啊,写的都是什么鬼

java6 个月一次的发布节奏

从2017年9月发布Java 9开始,Oracle每六个月就会发布一个新版本的JDK,具体来说是每年的三月和九月。现在持续发布大行其道,所以一门语言一改以往三年发布一次的做法,转而采用更快的发布速度,这也完全合情合理。

在新的发布节奏下,不会再出现每几年发布一大堆功能的情况(伴随着风险极高的大型升级),而是在预定的日期内推出更小的发布。当然,这些发布包含的功能会少很多,但这种方式有好处:
1方便计划。预定的发布节奏不仅方便了语言开发者,也方便使用者制定升级计划。
2更高的质量。更频繁的发布意味着如果某次发布中某个功能没有做好,就会被推迟到下一次发布。因此,语言开发者的压力更小,不需要赶工完成功能,因此每次发布的质量更高。
3稳定的新功能来源。以前是每三年一次巨大的更新,而现在可以持续地获得更新,包括语言特性、垃圾收集器的变化和性能改善。
然而更新的这么频繁,我们一个JDK的功能都用不完,每次还加新功能这谁受得了,Oracle自己也受不了啊!所以有了长期支持版

jdk的长期支持版

Oracle不愿意像以前每三年发布一个版本时那样支持每个旧版本,这样做的成本太高。
如果Oracle每六个月发布的版本都要支持三年,那么在2020年前后他们就要支持六个不同的版本!
相反,他们说每三年会有一个“长期支持的版本”(Long Term Support release,简称LTS),该版本会提供为期三年的支持。Java 8是一个LTS,当前的LTS是Java 17
我们下载用的就只挑LTS版本的

jdk的授权变化

长期支持版本有个问题。Oracle的立场是,如果你需要长达三年的支持和更新,就应当考虑为其付费。所以,如果你想使用LTS版本并要求三年的支持,就要为Oracle的商业版JDK付费。
但是,Oracle也认识到并不是每个人都愿意付费,而且许多人更喜欢用开源的方式工作,所以他们现在有两个版本的JDK,其特性完全一样,但授权不同。商业版JDK可以在开发和测试中免费使用,但在生产环境中使用则需要付费;还有一个完全免费的OpenJDK版本。后者采用了开源的GPLv2+CPE授权,但其生命周期只有六个月。
所以除了选LTS版本的,就还选择open版的

JDK命名的区别

Java Development Kit(JDK)是太阳微系统针对Java开发人员发布的免费软件开发工具包(SDK,Software development kit)。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。
 作为Java语言的SDK,普通用户并不需要安装JDK来运行Java程序,而只需要安装JRE(Java Runtime Environment)。而程序开发者必须安装JDK来编译、调试程序。

Java1.8和Java8到底是哪个?

JDK8或者JDK1.8是由于自从JDK1.5/JDK5命名方式改变后遗留的新旧命令方式问题。所以JDK8或者JDK1.8也是同一个东西。

JDK与J2SE的区别

JAVA就是指JDK开发工具,所以我们可以理解为JAVA等价于JDK。JAVA有3个版本:J2SE J2EE J2ME,而J2SE是标准版本,J2ME是手机方向的,J2EE是网站开发方向的。


Java8的特性

Java8是 Java 语言的一个重要版本,该版本于2014年3月发布,是自Java5以来最具革命性的版 本,这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性
(现在都出Java17了但是Java8仍然是成熟程序猿的首选,可能是项目底层用的JDK8,已经不好改了)

提供函数式的接口

函数式接口主要指只包含一个抽象方法的接口,如:java.lang.Runnable、java.util.Comparator 接口等。
Java8提供@FunctionalInterface注解来定义函数式接口,若定义的接口不符合函数式的规范便会报错。

提供Lambda表达式

Lambda 表达式是实例化函数式接口的重要方式,使用 Lambda 表达式可以使代码变的更加简洁 紧凑。
lambda表达式:参数列表、箭头符号->和方法体组成,而方法体中可以是表达式,也可以是语句 块。
语法格式:(参数列表) -> { 方法体; } - 其中()、参数类型、{} 以及return关键字 可以省略。

提供方法引用

方法引用是在特定场景下lambda表达式的一种简化表示,可以进一步简化代码的编写使代码更加 紧凑简洁,从而减少冗余代码。

新增Stream接口和Optional类

这接口就不用详细描述了吧~写Java的第一个程序就用到了 System.out.println();

Java9的新特性

Java9最主要的变化就是模块化系统
模块就是代码和数据的封装体,模块的代码被组织成多个包,每个包中包含Java类和接口,模块的 数据则包括资源文件和其他静态信息。
但是这也是为什么不用Java9的原因(在Java8的时代可不是每个项目都是模块化的,代码耦合严重,看着都不想改,一旦使用Java9之后强制修改你就能见到上千个bug了)

Java10的新特性

Java10于2018年3月发布,改进的关键点包括一个本地类型推断、一个垃圾回收的增强。Java10计划只是一个短期版本,因此公开更新将在六个月内结束,9月份发布的Java11将是Java的 长期支持(LTS)版本,LTS版本的发布每三年发布一次。

Java11的新特性

简化的编译运行操作

在Java11中可以使用java命令一次性进行编译和运行操作。
执行源文件中的第一个类必须包含主方法。不可以使用其它源文件中自定义的类。
这个是选择使用Java11最主要的原因之一,再也不用每次改完代码都要重新生成一个.class文件了,当然Java11仍然支持使用控制台编译的方式运行。

String类新增了一些方法

方法声明功能介绍
boolean isBlank()判断字符串是否为空或只包含空白代码点
Optional map(Function mapper)根据参数指定规则的结果来得到Optional类 型的对象
T orElse(T other)若该值存在就返回,否则返回other的数 值。

Java12-16

这些不是LTS版本的就不做过多的介绍了,新特性也真的没什么用,过一段时间就更新,Oracle的程序猿也忙不过来。

Java17的新特性

2021年09月14日刚发布的新版本,还和13香一起发布的(+_+)。
我用了一段时间感觉没什么区别,就是JDK的一些依赖包不允许你修改了,看技术文档是说移除了很多东西。

特性功能介绍
Restore Always-Strict Floating-Point Semantics恢复始终执行严格模式的浮点定义
Enhanced Pseudo-Random Number Generators增强型伪随机数生成器
New macOS Rendering Pipeline新的 macOS 渲染管道(没用过mac不知道是不是快一点)
macOS/AArch64 Port新增macOS AArch64 端口
Deprecate the Applet API for Removal弃用 Applet API
Strongly Encapsulate JDK InternalsJDK 内部强封装
Pattern Matching for switch (Preview)为 switch 支持模式匹配
Remove RMI Activation移除 RMI 激活
Sealed Classes密封类
Remove the Experimental AOT and JIT Compiler移除实验性的 AOT 和 JIT 编译器
Deprecate the Security Manager for Removal弃用安全管理器
Foreign Function & Memory API (Incubator)外部函数和内存 API(孵化中)
Vector API (Second Incubator)矢量 API(二次孵化中)
Context-Specific Deserialization Filters上下文特定反序列化过滤器

上面的很多特性如果不用到特定框架就感觉不到区别的,我觉得Java17又有一个新平台支持这个特性就还行,JEP 391:macOS AArch64 端口。该端口允许将 Java 应用程序在新的基于 Arm 64 的 Apple Silicon 计算机上运行。
还有JEP 403:JDK 内部强封装,限制外部对 JDK 内部类进行访问,此更改会使应用程序更安全,并减少对非标准、内部 JDK 实现细节的依赖。

注:

大家也可以看看别人整理的发布版本特性,这里我找了一些写的比较好的给童鞋们。
https://shimo.im/docs/C1pC5q2Jff0DhCAz/read

如何评价 2021 年 9 月发布的 Java 17?

一文搞懂JDK8与Java1.8的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertOS

还会有大爷会打钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值