在一次面试的时候问到我感兴趣的技术,回答了JAVA,但被问到JDK,除了1.8,就一窍不通,感觉确实应该好好学习一下,至少常见的版本和常见的特性,可以没那么专业,没那么细致,但至少能说个一两句
最喜欢的JDK版本
我最喜欢JDK17,在这个版本有几点比较常见的特性,Switch语句的增强、字符块的成熟、密封类的引入,优化了空指针异常的信息,还有Record类,ZGC垃圾收集器在JDK17都比较成熟了。而且现在Spring6.x以及Spring Boot 3.x支持最低JDK17,而我们也知道,升级JDK版本,可能对上层业务有影响,还有不兼容,项目稳定性的风险。JDK17的用户量增长速度也很快,也富含上面版本的一些特性,也比较成熟稳定,毕竟也没有那么专业,没有理解过多细致的变化,所以综合下来说一个比较喜欢的版本,就算是JDK17吧。
JDK1.8:
Lambda表达式、接口默认方法、Stream API、日期时间 API、Optional类等,
还有元空间代替永久代,改善内存管理;HashMap的优化;
详细介绍:
-
Lambda 表达式:
-
允许将功能作为方法参数传递或将代码作为数据处理,极大简化了集合的处理和多线程编程。
-
例如:
List<String> list = Arrays.asList("a", "b", "c"); list.forEach(item -> System.out.println(item));
-
-
Stream API:
-
提供了一种新的方法来处理集合,支持链式操作、过滤、映射和减少操作,使得集合处理更加简洁和高效。
-
例如:
List<String> list = Arrays.asList("a", "b", "c"); list.stream() .filter(s -> s.startsWith("a")) .forEach(System.out::println);
-
-
日期和时间 API:
-
引入了新的日期和时间库 java.time,取代了旧的 java.util.Date 和 java.util.Calendar,提供了更好的日期和时间处理支持。
-
例如:
LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1); Period age = Period.between(birthday, today);
-
-
接口默认方法:
-
允许在接口中定义默认方法,从而为接口添加新的方法而不需要修改实现该接口的现有类。
-
例如:
public interface Vehicle { default void print() { System.out.println("I am a vehicle"); } }
-
-
Nashorn JavaScript 引擎:
-
引入了一个新的 JavaScript 引擎 Nashorn,允许在 JVM 上执行 JavaScript 代码,提升了与 JavaScript 的互操作性。
-
例如:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval("print('Hello, Nashorn');");
-
-
Optional Class (JEP 126) Optional 类:
-
引入了 Optional 类来避免空指针异常,提供了一种更优雅的处理可能为空的值的方法。
-
例如:
Optional<String> optional = Optional.of("hello"); optional.ifPresent(System.out::println);
-
-
Metaspace:
-
将永久代(PermGen)替换为元空间(Metaspace),改善了内存管理。
-
-
Compact Profiles (JEP 161) 精简配置:
-
允许创建包含 JDK 一部分功能的精简配置,从而在资源受限的设备上运行 Java 应用。 这些特性大大提升了 Java 的功能和性能,简化了编程过程,并提供了更多现代化编程的支持。
-
JDK11:
-
增加了一些字符串API
-
在Lambda表达式可以使用var变量,在需要给变量增加注解时,不添加类型修饰会报错
-
可以使用HttpClients简单调用Http接口(之前都是使用其他框架的调用方式,JDK调用太麻烦)
-
带来跨时代意义的ZGC出现
JDK17:
switch-case:扩展 switch 语句和表达式进行模式匹配,支持复杂条件检查与操作。
下图是JDK12就推出的,可以将值直接返回需要赋值的变量
下图是JDK17推出,可以匹配多个变量,有多行业务代码,也可以使用大括号{}解决,还能对变量类型进行匹配。
字符块的概念:(JDK15提出的)解决恶心的字符串拼接,很多双引号和加号,三个双引号组成字符块,
17还引入两个转义符:
-
\:置于行尾,用来将两行连接为一行
-
\s:单个空白字符
(尤其在使用模版引擎时,需要大量html代码)
instanceof增强:(JDK14提出的,16投入使用)避免需要使用变量的时候,又得强行转换类型。
限制子类继承:sealed关键字,设置类为密封类,permit只能允许哪些类继承,但子类只能用final修饰和non-sealed修饰,控制能否再被子类继承。
好处就是更加安全,可控(限制范围,只能包下)
Record类:(JDK15)类似lombok的属性只读对象,添加record关键字代替class关键字,在编译阶段生产构造器,还有重写相等方法,没有lombok强大,适用场景也不多,不多了解。
优化空指针异常信息:(JDK14)我认为这是比较好的优化。告诉哪个对象为null,以前就只会告诉哪一行,哪个对象只能猜。
ZGC垃圾收集器:(JDK11诞生,JDK15使用,JDK17就比较成熟了)简单来说垃圾回收不卡顿,垃圾回收的时候都会触发STW,只能减少他停顿的时间。ZGC停顿时间是小于10ms。还有个优化手段,堆内存设计很大(十几T级别),就会很少触发GC的次数。
JDK 21
虚拟线程(19提出):一种轻量级的线程实现,可以极大地提高并发编程的性能和可伸缩性。虚拟线程允许开发人员以更低的开销创建和管理大量线程。
有序集合:提供了新的接口用于表示有序集合,例如 List、Set 和 Map 的有序变体,增强了集合操作的灵活性。
结构化并发: 引入了一种新的并发编程模型,简化了并发任务的管理,提高了错误处理和取消操作的可控性。 这些特性和改进旨在提升开发者的生产力,增强 Java 应用的性能和安全性,并确保 Java 在现代开发环境中继续保持竞争力。
ZGC增加分代功能,提高内存管理性能
JDK 22
性能:
-
对G1垃圾回收器提升了它的一个固定区的一个延迟等待的时间。
语法糖:
-
main方法的简化,不过我感觉也没必要
-
字符串模版,可以将占位符直接嵌入到字符串当中,可以进行快速的替换
-
用不到的变量用下划线代替,提高代码可读性
java语法,编译方式:
-
可以直接通过运行java原文件(JDK11提出,但只能运行一个文件),跟一个文件相关联的其他java文件都可以运行
-
可以直接在Super和构造方法上面执行一些代码
参考:
B站-徐庶老师视频
详细一点参考:
2024年主流使用的JDK版本及其核心特性介绍-CSDN博客
标签:java,JDK,JDK17,特性,接口,版本,Optional From: https://blog.csdn.net/qq_62097431/article/details/143663932