之前整理过JDK11的一些有用的新特效介绍jdk11特性,这次再整理一期5-9的新特性(下次有机会再整理一次11-17的)
针对8中java基本数据类型和他们对应的封装类(如int和Integer)进行自动转换。
泛型具体内容可以参考Java泛型深入理解
支持在import的时候直接import类名+函数名来直接导入指定静态函数
即int…这种参数 注:可变参数只可作为函数的最后一个参数
private static int add(int a, int... intArray) {
int sum = 0;
sum += a;
for (int i : intArray) {
sum += i;
}
return sum;
}
详情见Java注解
public enum DeviceStatus {
ONLINE,
WARN,
OFFLINE;
}
在使用泛型时可以不用声明类型,由编译器自动根据函数的调用来判断类型。
可以通过使用注解来在编译时进行检查并抛出错误
try内部在使用了如InputStream等资源的时候可以自动关闭,无需再手动执行close函数。
jdk7之前
Map<String, List<String>> anagrams =newHashMap<String, List<String>>();
jdk7之后
Map<String, List<String>> anagrams =newHashMap<>();
后面的<>被称为diamond(钻石)运算符,用来从引用的声明中推断类型。
int million=1_000_000
虽然这看起来很奇怪,一般也没人这么用
之前只支持十进制(123),八进制(0123),十六进制(0x123),jdk7之后支持了二进制0b11110000
支持为接口方法添加默认实现(使用default关键词)
详情见万字长文详解Java lambda表达式
如Function、Comparator等,具体见https://blog.csdn.net/qq_39208536/article/details/124978102
详情见【java基础】Stream流的各种操作
用来解决空指针问题
丰富了时间相关的Api,其中新增了DateTimeFormatter(和之前的NumberFormatter不同的是这这个是线程安全的)。
允许重复,并拓宽了适用对象
将Base64javaFx和添加到java基本库中
类似 NodeJS 和 Python 中的读取-求值-打印循环,如
jshell> int add(int x, int y) {
...> return x + y;
...> }
| created method add(int,int)
jshell> add(1, 2)
$19 ==> 3
增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法来创建不可变集合
List.of();
List.of("Hello", "World");
List.of(1, 2, 3);
Set.of();
Set.of("Hello", "World");
Set.of(1, 2, 3);
Map.of();
Map.of("Hello", 1, "World", 2);
Stream 中增加了新的方法 ofNullable、dropWhile、takeWhile 和 iterate。
public void testDropWhile() throws Exception {
final long count = Stream.of(1, 2, 3, 4, 5)
.dropWhile(i -> i % 2 != 0)
.count();
assertEquals(4, count);
}
Collectors 中增加了新的方法 filtering 和 flatMapping。
public void testFlatMapping() throws Exception {
final Set<Integer> result = Stream.of("a", "ab", "abc")
.collect(Collectors.flatMapping(v -> v.chars().boxed(),
Collectors.toSet()));
assertEquals(3, result.size());
}
Optional 类中新增了 ifPresentOrElse、or 和 stream 等方法。
public void testStream() throws Exception {
final long count = Stream.of(
Optional.of(1),
Optional.empty(),
Optional.of(2)
).flatMap(Optional::stream)
.count();
assertEquals(2, count);
}
新增 ProcessHandle 接口用来管理原生进程
新增System.LoggerFinder用来管理JDK的日志记录。
变量句柄是一个变量或一组变量的引用,包括静态域,非静态域,数组元素和堆外数据结构中的组成部分等
变量句柄的含义类似于已有的方法句柄 MethodHandle ,由 Java 类 java.lang.invoke.VarHandle 来表示,可以使用类 java.lang.invoke.MethodHandles.Lookup 中的静态工厂方法来创建 VarHandle 对象。
VarHandle 的出现替代了 java.util.concurrent.atomic 和 sun.misc.Unsafe 的部分操作。并且提供了一系列标准的内存屏障操作,用于更加细粒度的控制内存排序。在安全性、可用性、性能上都要优于现有的 API。
新增var关键字(局部变量类型推断)
var id = 0;
var codefx = new URL("https://mp.weixin.qq.com/");
var list = new ArrayList<>();
var list = List.of(1, 2, 3);
var map = new HashMap<String, String>();
var p = Paths.of("src/test/java/Java9FeaturesTest.java");
var numbers = List.of("a", "b", "c");
for (var n : list)
System.out.print(n+ " ");
从 Java9 开始 G1 就了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收期在无法回收内存的时候触发 Full GC。
为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。
在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。
Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。