java新技术
ddatsh
https://www.developers.pub/article/1194465
https://kaimingwan.com/2024/01/29/vvtzk3gai7530pmp/
https://kaimingwan.com/2023/01/31/bybtiusebwcawiyd/
https://www.cnblogs.com/javastack/p/14583578.html
Amber
字符串模板、简化 main 方法、 statements before this () and super ()
Records、Sealed Class、Pattern Matching、Raw String Literals
- 简化 main 方法
void main() {
System.out.println("Hello, World!");
}
javac --enable-preview --release 23 Hello.java
java --enable-preview Hello
java --enable-preview Hello.java
JEP-286/323
-
局部变量类型推断:Java 10
var
关键字,编译器自动推断类型信息 -
switch 表达式:Java 12
四项改进:fall-through语义,组合形式,穷举性,表达式形式
类似模式匹配,保证只有一种路径会被执行,并且不需要break语句
String fruit = "apple"; switch (fruit) { case "apple" -> System.out.println("Selected apple"); case "pear" -> System.out.println("Selected pear"); case "mango" -> { System.out.println("Selected mango"); System.out.println("Good choice!"); } default -> System.out.println("No fruit selected"); }
变量赋值
int opt; switch (fruit) { case "apple": opt = 1; break; case "pear": case "mango": opt = 2; break; default: opt = 0; break; }
新switch,不需要break,还可直接返回
String fruit = "apple"; int opt = switch (fruit) { case "apple" -> 1; case "pear", "mango" -> 2; default -> 0; }; // 注意赋值语句要以;结束 System.out.println("opt = " + opt);
复合case
switch (event) { case PLAY -> System.out.println("User has triggered the play button"); case STOP, PAUSE -> System.out.println("User needs to relax"); };
yield返回一个值作为switch语句返回值
String fruit = "orange"; int opt = switch (fruit) { case "apple" -> 1; case "pear", "mango" -> 2; default -> { int code = fruit.hashCode(); yield code; // switch语句返回值 } }; System.out.println("opt = " + opt);
with 表达式和 primitive types in patterns
从Java 8开始,Java的发展很明显受到了函数式编程的影响
- Java 8引入lambda表达式及流(stream)
- Java 9带来支持响应式流的Flow API
- Java 10新增了局部变量类型推导
Babylon
Leyden
为了解决java启动慢的问题
java是解释+JIT一起工作的,leyden项目的目的就是替换老的这种方式,称之为static-image,相比传统AOT只是直接把代码编译成机器码,static-image除了把代码编译成机器码,还会把runtime信息一起编译成机器码,在运行时能够完整运行
Loom
旨在拓展jdk 1:1的线程模型,引入协程
以前jdk线程模型和操作系统线程1:1对应,适合CPU密集型任务,但对于需要大量线程的I/O密集型任务,过重的线程开销和频繁的上下文切换对性能开销都比较大
那种侵入很强,不仅要引入新的返回类型,future或者promise,而且还要引入两个额外的关键字async和await,特别麻烦
Panama
Upcall: 本地代码调Java
Downcall:Java调本地代码
Panama在downcall上的意义在于,可以省略JNI那样的wrapper,直接加载动态链接库以及根据symbol取函数地址。少一个wrapper可以少一次函数调用
Panama也给给内存结构做了标准化。JVM也可以算是支持 结构体、union、值类型 了
- Vector API
- Foreign Function
- Memory API
- jextract
Valhalla
Java一切皆对象理念对于工程化很有帮助,但处理一系列类型不同的小对象时性能十分拉胯 Valhalla项目通过引入值对象来改善这一问题,提升java在游戏、图形领域竞争力
Lilliput
缩小 HotSpot JVM 中 Java object headers 的大小并减少 Java 内存占用
fast-locking scheme