目录
一、Java17新特性
1、switch语法的变化(预览)
2、Sealed Classes
3、伪随机数的变化
4、去除了AOT和JIT
二、Java18新特性
1、默认使用UTF-8字符编码
2、简单的web服务器
3、将被移除的方法
4、@snippet注解
三、Java19新特性
1、Virtual Threads(Preview)虚拟线程
四、Java20新特性
Java17是一个LTS(long term support)长期支持的版本,根据计划来看会支持到2029年(java8会支持到2030年),同时Oracle提议下一个LTS版本是java21,在2023年9月发布,这样将LTS版本的发布周期由之前的3年变为了2年。
Java17其他特性
Oracle is collaborating with the Java developer community and the JCP on enhancing LTS
scheduling to give organizations more flexibility on when, or if, they want to migrate to
a newer Java LTS version. Oracle is proposing that the next LTS release should be Java 21
and made available in September 2023, which will change the ongoing LTS release cadence
from three years to two years.
Oracle正在与Java开发人员社区和JCP合作,增强LTS调度,以使组织在何时或是否希望迁移到较新的Java LTS
版本方面具有更大的灵活性。Oracle建议下一个LTS版本应该是Java 21,并于2023年9月发布,这将把正在进行
的LTS发布周期从三年改为两年。
Java版本支持时间
oracle官网
在之前版本中新增的instanceof模式匹配的特性在switch中也支持了,即我们可以在switch中减少强转的操作。
Rabbit和Bird均实现了Animal接口
package com.lwz.java.v17;
public interface Animal {
}
class Rabbit implements Animal {
public void run() {
System.out.println("run");
}
}
class Bird implements Animal {
public void fly() {
System.out.println("fly");
}
}
测试
package com.lwz.java.v17;
public class Switch01 {
public static void main(String[] args) {
Animal a=new Rabbit();
animalEat(a);//run
}
public static void animalEat(Animal a){
switch (a){
case Rabbit r -> r.run();//判断a是否是Rabbit类型,若是则强转之后赋值给r
case Bird b ->b.fly();
case null -> System.out.println("null");
default -> System.out.println("no animal");
}
}
}
jdk15中已经添加了Sealed Classes,只不过当时是作为预览版,经历了2个版本之后,在jdk17中Sealed Classes已经成为正式版了,Sealed Classes的作用是可以限制一个类或者接口可以由哪些子类继承或者实现。
增加了伪随机数相关的类和接口来让开发者使用stream流进行操作
RandomGenerator
RandomGeneratorFactory
之前的java.util.Random和java.util.concurrent.ThreadLocalRandom都是RandomGenerator接口的实现类。
AOT(Ahead-of-Time)是java9中新增的功能,可以先将应用中的字节码编译成机器码。
Graal编译器作为使用java开发的JIT(just-in-time)即时编译期在java10中加入
java新特性
从jdk18开始,默认使用UTF-8字符编码。我们可以通过如下参数修改为其他字符编码:
-Dfile.encoding=UTF-8
可以通过jwebserver命令启动jdk18中提供的静态web服务器,可以利用该工具查看一些原型,做简单的测试。在命令提示符中输入jwebserver命令后会启动,然后在浏览器中输入:http://127.0.0.1:8000/即可看到当前命令提示符路径下的文件了。
D:\.m2>jwebserver
默认情况下绑定到环回。如果要表示所有接口,请使用 "-b 0.0.0.0" 或 "-b ::"。
为 127.0.0.1 端口 8000 上的 D:\.m2 及子目录提供服务
URL http://127.0.0.1:8000/
若cmd执行jwebserver出现中文乱码解决方法:
设定cmd的编码为utf-8
打开cmd,输入以下命令
chcp 65001
这样既可以更改cmd的编码为UTF-8了。
以下是常用的cmd编码
字符编码 | 对应字符 |
GBK(默认) | 936 |
美国英语 | 437 |
utf-8 | 65001 |
-- 运行jar解决中文乱码
java -Dfile.encoding=utf-8 -jar project.jar
在jdk18中标记了Object中的finalize方法,Thread中的stop方法将在未来被移除
@Deprecated(since="1.2", forRemoval=true)
public final void stop() {
throw new UnsupportedOperationException();
}
以前在文档注解中编写代码时需要添加code标签,使用较为不便,通过@snippet注解可以更方便的将文档注释中的代码展示在api文档中。
package com.lwz.java.v17;
/**
* 代码注释
* {@snippet :
* System.out.println();
* }
*/
public class SnippetTest {
public static void main(String[] args) {
System.out.println();
}
}
使用javadoc生成注释文件
D:\...java\com\lwz\java\v17>javadoc -d myfile SnippetTest.java
正在加载源文件SnippetTest.java...
正在构造 Javadoc 信息...
正在创建目标目录: "myfile\"
正在构建所有程序包和类的索引...
标准 Doclet 版本 21.0.1+12-LTS-29
正在构建所有程序包和类的树...
正在生成myfile\com\lwz\java\v17\SnippetTest.html...
SnippetTest.java:9: 警告: 使用不提供注释的默认构造器
public class SnippetTest {
^
SnippetTest.java:10: 警告: 没有注释
public static void main(String[] args) {
^
正在生成myfile\com\lwz\java\v17\package-summary.html...
正在生成myfile\com\lwz\java\v17\package-tree.html...
正在生成myfile\overview-tree.html...
正在构建所有类的索引...
正在生成myfile\allclasses-index.html...
正在生成myfile\allpackages-index.html...
正在生成myfile\index-all.html...
正在生成myfile\search.html...
正在生成myfile\index.html...
正在生成myfile\help-doc.html...
2 个警告
会生成myfile文件夹,双击index.html文件,效果如下
该特性在java19中是预览版,虚拟线程是一种用户态下的线程,类似go语言中的goroutines和Erlang中的processes,虚拟线程并非比线程快,而是提高了应用的吞吐量,相比于传统的线程是由操作系统调度来看,虚拟线程是我们自己程序调度的线程。如果你对之前java提供的线程API比较熟悉了,那么在学习虚拟线程的时候比较轻松,传统线程能运行的代码,虚拟线程也可以运行。虚拟线程的出现,并没有修改java原有的并发模型,也不会替代原有的线程。虚拟线程主要作用是提升服务器端的吞吐量。
吞吐量的瓶颈
服务器应用程序的伸缩性受利特尔法则(Little's Law)的制约,与下面3点有关
1、延迟:请求处理的耗时
2、并发慢:同一时刻处理的请求数量
3、吞吐量:单位时间内处理的数据数量
比如一个服务器应用程序的延迟是50ms,处理10个并发请求,则吞吐量是200请求/秒(10/0.05),如果吞吐量要达到2000请求/秒,则处理的并发请求数量是100.按照1个请求一个线程的比例来看,要想提高吞吐量,线程数量也要增加。
java中的线程是在操作系统线程(OS thread)进行了一层包装,而操作系统中线程是重量级资源,在硬件配置确定的情况下,我们就不能创建更多的线程了,此时线程数量就限制了系统性能,为了解决该问题,虚拟线程就出现了。
Java14-16新特性
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!