- 设计有缺陷,Date 类同时包含日期和时间;还有一个 java.sql.Date,容易混淆。
java9新特性
1.模块化系统
java9的时候最大的一个新特性是模块化系统,模块系统的核心原理是将应用程序划分为一组模块,并通过 module-info.java 文件来定义模块的信息和依赖关系
Java 应用可以通过新增的Jlink工具 (Jlink 是随 Java 9 一起发布的新命令行工具。JDK 9 引入的新特性允许开发人员为基于模块化的 Java 应用程序创建自定义、轻量级的 JRE(Java Runtime Environment)。开发人员可以根据所依赖的 JDK 模块创建自定义的运行时镜像,这将大大减少 Java 运行时环境的大小。
我们可以通过 exports 关键词控制模块及使用范围。
module limit.module {
//exports 公开指定包的所有公共成员
exports com.my.package.name;}
module limit.module {
//exports…to 限制访问的成员范围
export com.limit.package.name to com.target.limit.package;
}
2.G1 成为默认垃圾回收器
在 Java 8 中,默认使用的垃圾回收器为 Parallel Scavenge(新生代)+Parallel Old(老年代)。但到了 Java 9,CMS 垃圾回收器被弃用,取而代之的是 G1(Garbage-First Garbage Collector),成为新的默认垃圾回收器。
实际上,G1 垃圾回收器在 Java 7 中就已经被引入,而经过两个版本的表现表现优异后,它于 Java 9 成为了默认的垃圾回收器。
3.接口私有方法
Java 9 允许在接口中使用私有方法。
public interface PrivateInterface {
private void privateM(){
}
}
4.快速创建不可变集合
增加了List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合。使用 of() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。
5.String 存储结构优化
Java 8 及之前的版本,String 一直是用 char[] 存储。在 Java 9 之后,String 的实现改用 byte[] 数组存储字符串,节省了空间。
6.try-with-resources 增强
在 Java 9 之前,我们只能在 try-with-resources 块中声明变量:
try (FileInputStream inputStream = new FileInputStream("a.txt");) {
} catch (IOException e) {
throw new RuntimeException(e);
}
在 Java 9 之后,在 try-with-resources 语句中可以使用 effectively-final 变量。
final FileInputStream inputStream = new FileInputStream("a.txt");
try (inputStream) {
} catch (IOException e) {
throw new RuntimeException(e);
}
什么是 effectively-final 变量? 如果对象或基础类型的变量在初始化后值不发生改变,则可以把它们看做 effectively final
7.Stream & Optional 增强
Stream 中增加了新的方法 ofNullable()、dropWhile()、takeWhile() 以及 iterate() 方法的重载方法。
8.进程 API
Java 9 增加了 java.lang.ProcessHandle 接口来实现对原生进程进行管理,尤其适合于管理长时间运行的进程。
9.响应式流 ( Reactive Streams )
在 Java 9 中的 java.util.concurrent.Flow 类中新增了反应式流规范的核心接口 。
Flow 中包含了 Flow.Publisher、Flow.Subscriber、Flow.Subscription 和 Flow.Processor 等 4 个核心接口。Java 9 还提供了SubmissionPublisher 作为Flow.Publisher 的一个实现。
10.变量句柄
变量句柄是一个变量或一组变量的引用,包括静态域,非静态域,数组元素和堆外数据结构中的组成部分等。
变量句柄的含义类似于已有的方法句柄 MethodHandle ,由 Java 类 java.lang.invoke.VarHandle 来表示,可以使用类 java.lang.invoke.MethodHandles.Lookup 中的静态工厂方法来创建 VarHandle 对象。
VarHandle 的出现替代了 java.util.concurrent.atomic 和 sun.misc.Unsafe 的部分操作。并且提供了一系列标准的内存屏障操作,用于更加细粒度的控制内存排序。在安全性、可用性、性能上都要优于现有的 API。
11.平台日志 API 改进
Java 9 允许为 JDK 和应用配置同样的日志实现。新增了 System.LoggerFinder 用来管理 JDK 使 用的日志记录器实现。JVM 在运行时只有一个系统范围的 LoggerFinder 实例。我们可以通过添加自己的 System.LoggerFinder 实现来让 JDK 和应用使用 SLF4J 等其他日志记录框架。
12.CompletableFuture类增强
新增了几个新的方法(completeAsync ,orTimeout 等)。
13.I/O 流的新特性
增加了新的方法来读取和复制 InputStream 中包含的数据。
14.改进方法句柄(Method Handle)
方法句柄从 Java7 开始引入,Java9 在类java.lang.invoke.MethodHandles 中新增了更多的静态方法来创建不同类型的方法句柄。
java10新特性
1.局部变量类型推断(var)
Java 10 提供了 var 关键字声明局部变量。
var i = 0;
var url = new URL("https://mp.weixin.qq.com/");
var list = new ArrayList<>();
var map = new HashMap<String, String>();
for (var n : list){
System.out.print(n+ " ");
}
var不能声明为 null,不能声明为 Lambda表达式。
2.垃圾回收器接口
在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。
3.G1 并行 Full GC
从 Java9 开始 G1 就了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收期在无法回收内存的时候触发 Full GC。
为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 Full