JDK多版本对比

java部分

从9开始jdk的更新频率改为半年一更新,其中部分版本非长期支持版本,如jdk12非长期支持版本,当jdk13出了之后就不会在对jdk12进行支持,所以很多厂商如spring等对非长期支持的jdk版本并未表示要强力支持,实际使用也建议使用长期支持的版本

java不同版本新特性总览-(很多感知不强)

版本

帖子

openjdk官网

发布时间

java8

https://my.oschina.net/mdxlcj/blog/1622718

https://openjdk.java.net/projects/jdk8/

2014-03-18

java9

https://my.oschina.net/mdxlcj/blog/1622984

http://openjdk.java.net/projects/jdk9/

2017-09-21

java10

https://my.oschina.net/mdxlcj/blog/3009128

http://openjdk.java.net/projects/jdk10/

2018-03-20

java11-长期支持

https://my.oschina.net/mdxlcj/blog/3010342

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

2018-09-25

java12

https://my.oschina.net/mdxlcj/blog/3102739

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

2019-03-19

java13

https://my.oschina.net/mdxlcj/blog/3107021

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

2019-09-17

java14

https://my.oschina.net/mdxlcj/blog/3197478

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

2020-03-17

java15

https://my.oschina.net/mdxlcj/blog/4586284

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

2020-09-15

java16

https://my.oschina.net/mdxlcj/blog/5055983

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

2021-03-17

java17-长期支持

https://my.oschina.net/mdxlcj/blog/5261402

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

2021-09-14

java8

概述

说明

备注

Lambda 表达式

匿名函数(内部实现类的简写)

函数式接口

只包含一个抽象方法的接口,称为函数式接口

内置4大核心函数接口

  • Consumer<T > 消费型接口,对类型为T的对象应用操 作,包含方法: void accept(T t)
  • Supplier<T > 供给型接口 ,返回类型为T的对象,包 含方法:T get();
  • Function<T, R> 函数型接口,对类型为T的对象应用操 作,并返回结果。结果 是R类型的对象。包含方 法:R apply(T t);
  • Predicate<T > 断定型接 口 确定类型为T的对象是否 满足某约束,并返回

boolean 值。包含方法 boolean test(T t);

方法引用与构造器引用

对象::实例方法

类::静态方法

类::实例方法

ClassName::new

Stream API

是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列

接口中的默认方法与静态方法

新时间日期API

LocalDate、LocalTime、LocalDateTime

其他

  • Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且 可以避免空指针异常
  • 重复注解与类型注解,可重复的注解及可用于类 型的注解(不常用)

java9

概述

说明

备注

模块化系统

模块独立、化繁为简

另一种解决方案maven或gradle

jShell 命令

即写即得、快速运行和shell

多版本兼容 jar 包

对应不同的class文件使用不同的java版本,适用于老项目升级了jdk但新jdk语法不支持的

接口的私有方法

不对接口外暴露方法

语法改进:try 语句

用资源语句编写 try 将更容易,我们可以在 try 子句中使用已经初始化过的资源,此时的资源是 final 的

下划线使用限制

在 java 9 中规定“_”不再可以单独命名标识符了,如果使用, 会报错

String 存储结构变更

由jdk8之前的

private final char value[];

改成了

private final byte[] value;

目的

每个字符使用两个字节(十六位)但最重要的是字符串对象仅包含拉丁字符1。这样的字符只需要

一个字节的存储空间,因此占内部字符数组空间的一半这样的字符串对象中的一个将不再使用

http://openjdk.java.net/jeps/254

便利的集合特性:of()

List.of();Set.of();

增强的 Stream API

dropWhile, 返回剩余的元素

 

//76 87 42 77 90 73 67 88

public static void main(String[] args) {

List<Integer> list = Arrays.asList(45, 43, 76, 87, 42, 77, 90, 73, 67, 88);

list.stream().dropWhile(x -> x < 50).forEach(System.out::println);

}

takeWhile, 返回从开头开始的尽量多的元素

 

public static void main(String[] args) {

List<Integer> list = Arrays.asList(45, 43, 76, 87, 42, 77, 90, 73, 67, 88);

list.stream().takeWhile(x -> x < 50).forEach(System.out::println);

}

//45

//43

ofNullable,方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可 以创建一个空 Stream

 

public static void main(String[] args) {

//不报异常,允许通过

Stream<String> stringStream = Stream.of("AA", "BB", null);

System.out.println(stringStream.count());//3

//不报异常,允许通过

List<String> list = new ArrayList<>();

list.add("AA");

list.add(null);

System.out.println(list.stream().count());//2

//ofNullable():允许值为 null

Stream<Object> stream1 = Stream.ofNullable(null);

System.out.println(stream1.count());//0

Stream<String> stream = Stream.ofNullable("hello world");

System.out.println(stream.count());//1

}

多分辨率图像 API

图像处理相关,awt相关包下,平常用不到,

全新的 HTTP 客户端 API

java自身的http工具类,

性能表现https://www.cnblogs.com/victor2302/p/11077208.html

Deprecated 的相关 API

Applet API

智能 Java 编译工具

智能 java 编译工具( sjavac )的第一个阶段始于 JEP139 这个项目,

用于在多核处理器情况下提升 JDK 的编译速度。如今,这个项目已经

进入第二阶段,即 JEP199,其目的是改进 Java 编译工具,并取代目

前 JDK 编译工具 javac,继而成为 Java 环境默认的通用的智能编译工

统一的 JVM 日志系统

日志是解决问题的唯一有效途径:曾经很难知道导致 JVM 性能

问题和导致 JVM 崩溃的根本原因。不同的 JVM 日志的碎片化和日志

选项(例如:JVM 组件对于日志使用的是不同的机制和规则),这使

得 JVM 难以进行调试。

解决该问题最佳方法:对所有的 JVM 组件引入一个单一的系统,

这些 JVM 组件支持细粒度的和易配置的 JVM 日志。

javadoc 的 HTML 5 支持

javadoc 的输出,现在符合兼容 HTML 5 标准

Javascript 引擎升级:Nashorn

Javascript 引擎

java 的动态编译器

加快启动快速度,减少内存开销

尚未成熟

java10

概述

说明

备注

var局部变量

注意事项

  • 成员变量不行
  • 方法参数不行
  • 返回值类型不行
  • var不是关键字,只是一个保留字,意味着var可以作为类名,方法名。。。但不建议
  • var定义变量时必须立马赋值
  • var不能同时定义多个变量

copyOf方法

java.util.List、java.util.Set、java.util.Map新增加了一个静态方法copyOf

深克隆,克隆出来的新集合不可变

ByteArrayOutputStream重载toString

 

public static void main(String[] args) throws Exception {

String str = "我喜欢java";

ByteArrayInputStream bis = new ByteArrayInputStream(str.getBytes("utf-8"));

ByteArrayOutputStream bos = new ByteArrayOutputStream();

int c = 0;

while((c = bis.read()) != -1) {

bos.write(c);

}

//bos.toString() 默认的使用的UTF-8编码

System.out.println(bos.toString("gbk"));

}

PrintStream、PrintWriter

Java.io.PrintStream,Java.io.PrintWriter,这两个类都有三个新的构造方法,他们需要而外的参数charset

 

@Test

public void test3() throws FileNotFoundException, UnsupportedEncodingException {

String str = "我也特别喜欢java";

var pri = new PrintWriter("/Users/tentsuuhou/Desktop/11.txt");

pri.println(str);

pri.flush();

pri.close();

}

Reader:transferTo

 

@Test

public void test2() throws Exception {

FileReader fr = new FileReader("D:\\workspace\\code\\self\\javanew\\src\\test\\resources\\a.txt");

FileWriter fw = new FileWriter("D:\\workspace\\code\\self\\javanew\\src\\test\\resources\\c.txt");

fr.transferTo(fw);

fw.close();

fr.close();

}

Formatter、Scanner

java.util.Formatter、java.util.Scanner新增三个构造方法,除了其他参数之外,都需要一个charset参数

 

@Test

public void test5() throws FileNotFoundException {

var scan = new Scanner(new FileInputStream(new File("/Users/tentsuuhou/Desktop/11.txt")),"utf-8");

scan.useDelimiter(" |,");

while(scan.hasNext()) {

System.out.println(scan.next());

}

}

java11-长期支持版本

概述

说明

备注

String字符串api加强

 

@Test

public void test2() {

String string = " \t \r\n ";// 判断字符串中的字符是否都是空白

System.out.println(string.isBlank());

//全角的空格

string = " \t \r\n abc \t ";

String string2 = string.strip(); 去重字符串首尾的空白, 包括英文和其他所有语言中的空白字符

String string3 = string.trim(); // 去重字符串首尾的空白字符, 只能去除码值小于等于32的空白字符

String string4 = string.stripLeading(); // 去重字符串首部的空白

String string5 = string.stripTrailing(); // 去重字符串尾部的空白

}

增强局部变量类型推断var

 

@Test

public void test2() {

Consumer<String> consumer = t -> System.out.println(t.toUpperCase());

Consumer<String> consumer1 = (var t) -> System.out.println(t.toUpperCase());

//错误的形式:必须要有类型,可以加上var

//Consumer<String> consumer2 = (@Deprecated t) ->System.out.println(t.toUpperCase())

//正确的形式

Consumer<String> consumer3 = (@Deprecated var t) -> System.out.println(t.toUpperCase());

consumer1.accept("abc");

}

移除api

1、移除了com.sun.awt.AWTUtilities

2、移除了sun.misc.Unsafe.defineClass,使用java.lang.invoke.MethodHandles.Lookup.defineClass来替代

3、移除了Thread.destroy()以及 Thread.stop(Throwable)方法

4、移除了sun.nio.ch.disableSystemWideOverlappingFileLockCheck、sun.locale.formatasdefault属性

5、移除了jdk.snmp模块

6、移除了javafx,openjdk估计是从java10版本就移除了,oracle jdk10还尚未移除javafx,而java11版本则oracle的jdk版本也移除了javafx

7、移除了Java Mission Control,从JDK中移除之后,需要自己单独下载

8、移除了这些Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom

废弃项

1、-XX+AggressiveOpts选项

2、-XX:+UnlockCommercialFeatures

3、-XX:+LogCommercialFeatures选项也不再需要

HttpClient加强方法

 

//同步调用

@Test

public void test2() throws IOException, InterruptedException {

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder(URI.create("")).build();

BodyHandler<String> handler = HttpResponse.BodyHandlers.ofString();

HttpResponse<String> response = client.send(request,handler);

String body = response.body();

System.out.println(body);

}

//异步调用

@Test

public void test3() throws IOException, InterruptedException, ExecutionException {

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder(URI.create("")).build();

BodyHandler<String> handler = HttpResponse.BodyHandlers.ofString();

CompletableFuture<HttpResponse<String>> response = client.sendAsync(request,handler);

HttpResponse<String> result = response.get();

String body = result.body();

System.out.println(body);

}

Unicode 10

Unicode 10 增加了8518个字符, 总计达到了136690个字符. 并且增加了4个脚本.同时还有56个新的emoji表情符号。

删除模块

1、java.xml.ws,

2、java.xml.bind,

3、java.xml.ws,

4、java.xml.ws.annotation,

5、jdk.xml.bind,

6、jdk.xml.ws被移除,只剩下java.xml,java.xml.crypto,jdk.xml.dom这几个模块

7、java.corba,

8、java.se.ee,

9、java.activation,

10、java.transaction被移除,但是java11新增一个java.transaction.xa模块

废除Nashorn javascript引擎

在后续版本准备移除掉,有需要的可以考虑使用GraalVM

Pack200 Tools and API移除

一个压缩工具

新的Epsilon垃圾收集器

主要用途

性能测试(它可以帮助过滤掉GC引起的性能假象)

内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存, 我们可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有问题, 则程序会崩溃)

非常短的JOB任务(对象这种任务, 接受GC清理堆那都是浪费空间)

VM接口测试

Last-drop 延迟&吞吐改进

ZGC

  • GC暂停时间不会超过10ms
  • 既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
  • 和G1相比, 应用吞吐能力不会下降超过15%
  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
  • 初始只支持64位系统

不建议用于生成环境,测试阶段

原理帖子https://www.jianshu.com/p/4e4fd0dd5d25

完全支持Linux容器(包括Docker)

许多运行在Java虚拟机中的应用程序(包括Apache Spark和Kafka等数据服务以及传统的企业应用程序)都可以在Docker容器中运行。但是在Docker容器中运行Java应用程序一直存在一个问题,那就是在容器中运行JVM程序在设置内存大小和CPU使用率后,会导致应用程序的性能下降。这是因为Java应用程序没有意识到它正在容器中运行。随着Java 10的发布,这个问题总算得以解决,JVM现在可以识别由容器控制组(cgroups)设置的约束。可以在容器中使用内存和CPU约束来直接管理Java应用程序

支持G1上的并行完全垃圾收集

对于 G1 GC,相比于 JDK 8,升级到 JDK 11 即可免费享受到:并行的 Full GC,快速的 CardTable 扫描,自适应的堆占用比例调整(IHOP),在并发标记阶段的类型卸载等等。这些都是针对 G1 的不断增强,其中串行 Full GC 等甚至是曾经被广泛诟病的短板,你会发现 GC 配置和调优在 JDK11 中越来越方便

Low-Overhead Heap Profiling

过JVMTI的SampledObjectAlloc回调提供了一个开销低的heap分析方式

ChaCha20和Poly1305两种加密算法, 代替RC4

新的默认根权限证书集

最新的HTTPS安全协议TLS 1.3

Java Flight Recorder

飞机上的黑盒子,分析工具

帖子https://blog.csdn.net/qq_42105629/article/details/104944431

java12

概述

说明

备注

switch加强

jdk14转正

Shenandoah GC

低停顿时间的GC(预览)

Shenandoah GC 主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等

这是一个实验性功能,不包含在默认(Oracle)的OpenJDK版本中。

Microbenchmark Suite

在JDK源代码中添加一套基本的微基准测试,使开发人员可以轻松运行现有的微基准测试并创建新的基准测试。

JVM常量API

引入API来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量

AArch64端口

arm64在保留32位ARM端口和64位aarch64端口的同时,删除与端口相关的所有源

CDS档案

在64位平台上使用默认类列表增强JDK构建过程以生成类数据共享(CDS)归档

增强G1

增强G1垃圾收集器,以便在空闲时自动将Java堆内存返回给操作系统

Unicode11

更多字符

java.text支持压缩数字格式

 

@Test

public void testCompactNumberFormat(){

var cnf = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);

System.out.println(cnf.format(10000));//10K

System.out.println(cnf.format(1_9200));//19K

System.out.println(cnf.format(1_000_000));//1M

}

String增强

Function<T, R>类型的函数

 

@Test

public void testTransform1() {

var info1 = " hello ".transform(info -> info + " world ").transform(String::toUpperCase).transform(String::strip);

System.out.println(info1);

}

缩进字符

 

@Test

public void testTransForm2() {

System.out.println("======test java 12======");

String result = "Java\nPython\nC++".indent(3);

System.out.println(result);

}

File增强

返回两个文件不匹配的第一个未知

 

@Test

public void test1() throws IOException {

//返回第一个不匹配的位置

System.out.println(Files.mismatch(Path.of("tmp/a.txt"), Path.of("tmp/b.txt")));

}

移除项

  • 移除com.sun.awt.SecurityWarnin;
  • 移除FileInputStream、FileOutputStream、- Java.util.ZipFile/Inflator/Deflator的finalize方法;
  • 移除GTE CyberTrust Global Root;
  • 移除javac的-source, -target对6及1.6的支持,同时移除--release选项;

废弃项

  • 废弃的API列表见deprecated-list
  • 废弃-XX:+/-MonitorInUseLists选项
  • 废弃Default Keytool的-keyalg值

java13

概述

说明

备注

switch增强

预览版,jdk14转正

文本框

jdk15转正

动态CDS档案

可以让不同 Java 进程之间共享一份类元数据,减少内存占用,它还能加快应用的启动速 度。

增强ZGC

增强ZGC以将未使用的堆内存返回给操作系统。

重新实现旧版套接字API

重新实现了古老的 Socket 接口, java.net.Socket 和 java.net.ServerSocket

增加项

  • 添加FileSystems.newFileSystem(Path, Map<String, ?>) Method
  • 新的java.nio.ByteBuffffer Bulk get/put Methods Transfer Bytes Without Regard to Buffffer Position
  • 支持Unicode 12.1
  • 添加-XX:SoftMaxHeapSize Flag,目前仅仅对ZGC起作用
  • ZGC的最大heap大小增大到16TB

移除项

  • 移除awt.toolkit System Property
  • 移除Runtime Trace Methods
  • 移除-XX:+AggressiveOpts
  • 移除Two Comodo Root CA Certifificates、Two DocuSign Root CA Certifificates
  • 移除内部的com.sun.net.ssl包

废弃项

  • 废弃-Xverify:none及-noverify
  • 废弃rmic Tool并准备移除
  • 废弃javax.security.cert并准备移除

已知问题

不再支持Windows 2019 Core Server

使用ZIP File System (zipfs) Provider来更新包含Uncompressed Entries的ZIP或JAR可能造成文件损坏

java14

概述

说明

备注

instanceof的模式匹配

jdk16转正

预览

switch增强

 

@Test

public void test1() {

String x = "1";

int i = switch (x) {

case "1" -> 5;

case "2" -> 6;

default -> {

yield 7;

}

};

System.out.println(i);

}

@Test

public void test2() {

String x = "3";

int num = switch (x) {

case "1":

yield 1;

case "2":

yield 2;

case "3":

yield 3;

default:

yield 4;

};

System.out.println(num);

}

弃用ParallelScavenge和SerialOld GC

孵化器模块

删除CMS垃圾回收器

CMS在JDK9中就被标记为Deprecate了

打包工具

  • 这个孵化器工具为开发者带来了一种打包Java应用的方式,目的在于创建一个简 单的打包工具,可以用于构建exe、pkg、dmg、deb、rpm格式的安装文件。
  • JDK14引入了jdk.incubator.jpackage.jmod,它基于JavaFX javapackager tool构建。

孵化器模块

G1的NUMA-Aware的内存分配

JFR事件流

非易失性映射字节缓冲区

外部内存访问AP

弃用Solaris和SPARC的移植

删除Pack200工具和API

java15

概述

说明

备注

CharSequence中添加了isEmpty默认方法

定义isEmpty用于测试字符序列是否为空的默认方法,CharSequence::isEmpty可以用作方法参考。实现的类java.lang.CharSequence和定义isEmpty方法的另一个接口应注意这一点,因为可能需要对其进行修改以覆盖isEmpty方法

支持Unicode 13.0

增加字符支持

TreeMap新方法

TreeMap重新实现压倒性一切的如:putIfAbsent、computeIfAbsent、computeIfPresent、compute、merage

文本块

 

@Test

public void test1() {

String html = "<html>\n" +

" <body>\n" +

" <p>Hello, world</p>\n" +

" </body>\n" +

"</html>";

System.out.println(html);

System.out.println();

String html1 = """

<html>

<body>

<p>Hello, world</p>

</body>

</html>

""";

System.out.println(html1);

}

隐藏类

基于JVM构建的许多语言实现都依靠动态类生成来提高灵活性和效率

GC回收期

淘汰-XXUseAdaptiveGDBoundary

改进的序列化处理,IO

使用java.io.ObjectInputStream.setObjectInputFilter方法设置序列化过滤器时,必

须在从流中读取任何对象之前调用它。如果调用readObject或方法readUnshared,则该setObjectInputFilter方法将引发IllegalStateException。

支持货币分组分隔符

DecimalFormat / DecimalFormatSymbols类现在可以处理货币值的分组分隔符。例如,在奥地利(de-AT语言环境)中使用的德语语言的货币分组分隔符为“。”,而在其他德语语言环境中的货币分组分隔符为“。”。

time用默认值覆盖本地化值

ava.time.format.DateTimeFormatter.localizedBy(Locale)方法现在采用默认

的语言环境值,例如Chronology和/或DecimalStyle指定的语言环境参数。

time ValueRange.of

ValueRange.of(long min,long maxSmallest,long maxLargest),如果

最小值大于最小最大值,则将引发异常。但是,仅当最小值大于最大最大值时才会发生例外。

性能改进InflaterOutputStream.write

1、InflaterOutputStream(OutputStream out, Inflater infl, int bufLen)允

许指定要使用的解压缩器和缓冲区大小。

2、InflaterOutputStream.write(byte[] b, int off, int len)

正在使用最大512字节的缓冲区大小写入数据。

3、从JDK 15开始,通过InflaterOutputStream(OutputStream out, Inflater

infl,int bufLen)所指定的缓冲区大小将在对的调用中使用InflaterOutputStream.write(

byte[] b,int off, int len)。如果在调用InflaterOutputStream 构造函数时未指定缓冲

区大小,则默认为512字节。

集合性能提升(Better Listing of Arrays)

复制集合的首选方法是使用“复制构造函数”。例如,要将集合复制到新的ArrayList中,可以编写new ArrayList<>(collection)。在某些情况下,可能会制作其他临时副本,如果要复制的集合非常大,则应用程序应(意识到/监视)制作副本所需的大量资源。

G1优化

默认的堆区域大小计算已更改为默认情况下返回较大的区域。计算仍以2048个区域为目标,但是两个方面发生了变化,这些更改提高了启动和运行时性能

1、仅考虑最大堆大小。旧的计算还考虑了初始堆大小,但是当未设置堆大小时,这可能会产生意外的行为。

2、区域大小四舍五入到最接近的2的幂,而不是减小。在最大堆大小不是2的幂的情况下,这将返回更大的区域大小。

ZGC

Z垃圾收集器(ZGC)现在可以在生产中使用,不再标记为实验功能。通过使用-XX:+UseZGC命令行选项启用ZGC

转正了

模式匹配

第二预览版

redcord

jdk16转正

第二预览版

Sealed Classes

第一预览版

java16

概述

说明

备注

redcord

  • 获取成员变量的简单方法,以上面代码为例 name() 和 partner() 。注意区别 于我们平常getter的写法。
  • 一个 equals 方法的实现,执行比较时会比较该类的所有成员属性
  • 重写 equals 当然要重写 hashCode
  • 一个可以打印该类所有成员属性的 toString 方法。
  • 请注意只会有一个构造方法。
  • 还可以在Record声明的类中定义静态字段、静态方法、构造器或实例方法。
  • 不能在Record声明的类中定义实例字段;类不能声明为abstract;不能声明显式的 父类等。

简单理解为lombok

java.time 根据时段获取时间

 

@Test

public void test1(){

String date1 = DateTimeFormatter.ofPattern("a").format(LocalTime.now());

String date2 = DateTimeFormatter.ofPattern("B").format(LocalTime.now());

String date3 = DateTimeFormatter.ofPattern("k").format(LocalTime.now());

System.out.println(date1);//上午

System.out.println(date2);//下午

System.out.println(date3);

}

Stream新增toList方法

 

@Test

public void test2(){

//之前的写法

List.of(1, 2, 3, 4).stream().filter(f -> f > 2).collect(Collectors.toList());

//现在

List.of(1, 2, 3, 4).stream().filter(f -> f > 2).toList();

}

密封类

jdk17有调整

第二预览版

模式匹配instanceof

 

@Test

public void test1() {//此时的str的作用域仅限于if结构内。

Object obj = new String("hello,Java14");

if (obj instanceof String str) {

System.out.println(str.toUpperCase());

} else {

}

}

转正

打包工具

提供jpackage用于打包独立Java应用程序的工具。将jpackage tool被引入作为JDK 14的孵化工具通过JEP343它在JDK 15仍然是一个孵化工具,以便有时间额外的反馈。它已在JDK16中从孵化升级为可用于生产的功能。由于此过渡,jpackage模块的名称已从更改jdk.incubator.jpackage为jdk.jpackage。

java17-长期支持版本

概述

说明

备注

switch新增模式

 

@Test

public void test1(){

Object o;

switch (o) {

case null -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");

case String s -> System.out.println("判断是否为字符串,s:" + s);

case record p -> System.out.println("判断是否为Record类型: " + p.toString());

case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + ia.length);

case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);

case Student s -> System.out.println("判断是否为具体学生对象,student:" + s.toString());

case UserCommonService -> System.out.println("判断是否为普通用户实现类,然后走普通用户逻辑");

case UserVipService -> System.out.println("判断是否为vip用户实现类,然后走vip用户逻辑");

default -> System.out.println("Something else");

}

}

预览

Realed class密封类

 

public sealed interface Shape{

final class Planet implements Shape {}

final class Star implements Shape {}

final class Comet implements Shape {}

}

public abstract sealed class Test{

final class A extends Test {}

final class B extends Test {}

final class C extends Test {}

}

随机数增强

为伪随机数生成器 (PRNG) 提供新的接口类型和实现,包括可跳转的 PRNG 和额外的一类可拆分 PRNG 算法 (LXM)

浮点运算更加严格

简化数字敏感库开发,包括java.lang.Math和java.lang.StrictMath(对开发无实际意义)

Parallel GC

Parallel GC 默认启用自适应并行处理,并行GC确定java.lang.ref.Reference在垃圾收集期间用于处理实例的最佳线程数。

默认-XX:ParallelRedProcEnabled: true。在有多个线程可用于垃圾收集的机器上,明显改善了垃圾收集暂停的阶段,如果遇到垃圾收集暂停增加的情况,可以通过-XX:ParallelRedProcEnabled在命令行上指定到原始行为

增强TreeMap

TreeMap 没有对 putIfAbsent()、computeIfAbsent()、computeIfPresent()、compute() 方法的专门实现。默认实现经常导致两次树遍历,这会损害性能

弃用Socket实现工厂机制

弃用并最终删除用于为java.net 包中的套接字类型静态配置系统范围工厂 的 API 点

统一日志支持异步日志刷新

为了避免在使用统一日志的线程中出现不希望的延迟,用户现在可以请求统一日志系统以异步模式运行。通过传递命令行选项来完成的-Xlog:async。在异步日志模式下,日志站点将所有日志消息排入缓冲区。独立线程负责将它们刷新到相应的输出。中间缓冲区是有界的。缓冲区耗尽时,将丢弃排队消息。可以使用命令行选项控制中间缓冲区的大小-XX:AsyncLogBufferSize=<bytes>。

新增 java.time.InstantSource

java.time.InstantSource引入了一个新界面。这个接口是一个抽象java.time.Clock,只关注当前时刻,不涉及时区

javadoc工具

新的“新 API”页面和改进的“弃用”页面,JavaDoc 现在可以生成一个页面,总结最近 API 的变化。要包含的最新版本列表是使用--since命令行选项指定的。这些值用于查找@since要包含在新页面上的具有匹配标签的声明。该--since-label命令行选项提供了“新API”页面的标题文本使用。

java目前项目划分

Java 的变化速度从未如此之快——如今,该语言的新版本每六个月就会发布一次,而发展道路中的以下三大主要项目,将有助于确定 Java 的未来方向。

项目一:Loom 项目

尝试改进 Java 语言的并发处理方式,或者说是在对计算机在不同指令集执行之间切换能力的探索。

甲骨文公司 Loom 项目技术负责人 Ron Pressler 在 QCon 伦敦 2019 大会上向希望编写软件以处理并发任务的 Java

开发者们提出了两种都不够完美的选项:要么编写无法通过扩展处理大量并发任务的“简单同步阻塞代码”,要么编写

可扩展但编写难度极高且调试过程复杂的异步代码。

为了寻求解决这个问题的方法,Loom 项目引入了一种将任务拆分为线程的新方法——所谓线程,即是指计算机在运

行指令时的最小可能执行单元。在这方面,Loom 引入了被称为 fibers 的新型轻量级用户线程。

他在大会上指出,“利用 fibers,如果我们确保其轻量化程度高于内核提供的线程,那么问题就得到了解决。大家将

能够尽可能多地使用这些用户模式下的轻量级线程,且基本不会出现任何阻塞问题。”

利用这些新的 fibers,用户将能够扩展 Java 虚拟机(JVM)以支持定界延续(delimited continuations)机制,从而

使得指令集的执行实现暂停以及恢复。对这些延续进行暂停与恢复的任务将由 Java 中的 ForkJoinPool 调度程序以异

步模式处理。

根据说明文档所言,fibers 将使用与 Java 现有 Thread 类非常相似的 API,这意味着 Java 开发人员的学习曲线应该

不会太过陡峭。

项目二:Amber 项目

Amber 项目的目标,在于支持“更小、面向生产力的 Java 语言功能”的开发,从而加快将新功能添加至 Java 语言中的速度。

项目三:Valhalla 项目

Valhalla 项目专注于支持“高级”JVM 与语言功能的开发。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

꧁꫞ND꫞꧂

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值