不想细看的就选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 Internals | JDK 内部强封装 |
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