Java 8、9、10的新特性
Java 10
JDK 10 发布于 2018年3月20日。主要更新是局部变量推断和垃圾回收及编译算法提高。 JDK 10是个短期的版本,将要于今天九月份发布的JDK 11是个LTS版本。
主要特点:
- Local variable type inference: 使用初始化语句推段变量类型
- G1 支持并行化: 提高 worst-case 延迟
- 优化 class-data sharing
- 试验版just-in-time compier:Graal
- Docker awareness:在linux 平台,JVM可以知道 Container-specifi-information
- 三个新的JVM参数,用户Docker可以控制系统内存
jShell REPL tool
启动优化- 不可变集合实例化:Set.copyof,Map.copyOf,Collectors类的新方法:toUnmodifiableList/toUnmodifiableSet/toUnmodifableMap
- GC 接口更新,用于更方便地增加新的collector
- G1并行化
- HotSpot支持把对象堆分配到指定的内存设备上
- Grall
- JDK 代码库整理
- application class-data sharing
- thread-local handshakes?
- 默认官方根证书
Oracle在下个版本中声明的特性:
- Amber Project: productivity-oriented language,enhaced enums,lambda leftovers
- Project Panama: native code和JVM的交互增强
- Valhalla: valued types and generic specialization
- Project Loom: 目的是减少编写并发程序的难度
- Reference: https://www.infoworld.com/article/3230507/java/java-jdk-10-what-new-features-to-expect-in-the-next-java.html
Java 9
Java 9发布于2017年9月21日。最重要的更新是Java平台模块系统的引入
IBM Blog
Java平台模块系统
- Project Jigsaw把模块化开发实践引入到了Java平台
- 通过jlink工具,创建出只包含所依赖的JDK模块的自定义运行时镜像
- 模块的重要特征是其工件(artifact)的根目录中包含了一个描述模块的module-info.class 文件(由module-info.java编译),模块的内容包括:
- 模块导出的包
- 模块的依赖关系
requires
orrequires transitive
- 服务的提供和使用
ServiceLocator
oruses
orprovides with
getModule()
- 工件的格式是JAR文件或者JMOD文件
- JVM提供了相应的API和模块系统进行交互
1 | module com.mycompany.sample { //模块声明定义 |
Jshell
Jshell提供的功能类似于NodeJS和Python中的Read-Evaluation-PrintLoop 功能。
- 基本的表达式计算
- 创建Java 类和方法
- 执行代码片段
- 详细介绍请执行
jshell
=>/help /list
集合、Stream、Optional、进程
- List.of()\Set.of()\Map.of()\Map.ofEntries()等工厂方法返回不可变集合
- Stream新增API:filtering、flatMapping todo
- Optional 类新增API: ifPresentOrElse、or、stream
- 进程API:接口ProcessHandle可以对原生进程进行管理
平台日志API:System.LoggerFinder 来管理日志记录器实现
1
2
3
4
5
6public class Main {
private static final System.Logger LOGGER = System.getLogger("Main");
public static void main(final String[] args) {
LOGGER.log(Level.INFO, "Run!");
}
}Reactive Streams:
java.util.concurrent.Flow
, 核心接口:- Flow.Publisher
- Flow.Subscriber
- Flow.Subscription
- Flow.Processor
- 变量句柄: VariableHandler
java.lang.invoke.VarHandle
- 改进方法句柄:
java.lang.MethodHandles
- CompletableFuture
orTimeout
- Java8引入的JS引擎Nashorn增强:实现了ES6的新特性
- IO:
readAllBytes
,readNBytes
,transferTo
- 新增SHA-3 哈希算法,java.security.SecureRandom生成使用DRBG算法的强随机数
1 | import org.apache.commons.codec.binary.Hex; |
- 统一JVM日志:
-Xlog
控制JVM日志输出的标签、级别、修饰符、输出目标 - 新增jcmd调用的诊断命令
- 接口支持私有方法
Java 8
Java 8 发布于2014年3月18日。
- 函数式接口: @FunctionalInterface
- Lambda表达式
- 接口增强:
- default 修饰的非抽象方法:可以在子类中直接使用
- 增加静态方法,可以直接通过接口调用
Streaming API:实现集合的并行处理和函数式操作,根据操作返回结果的不同,流式操作分为中间操作和最终操作,前者返回流本身,后者返回一特定类型的结果,实现了集合的过滤、排序、映射等
- stream.sequential() 返回串行流
int count= (int) ((Stream) list.stream().sequential()).sorted().count();
stream.parallel() 返回并行流
int count = (int)((Stream) list.stream().parallel()).sorted().count();
- 中间操作:
filter/sorted/map/distinct/subStream list.stream() .filter((s) -> s.startsWith("s")) .forEach(System.out::println);
- 终止操作:forEach/toArray/findFirst/anyMatch
- 注解的更新:
- 增加了类型注解:ElementType.TYPE_USE/ElementType.TPYE_PARAMETER
- 使用Checker Framework等第三方工具在编译期检查出运行时错误
- 支持重复注解:@Repeatable(XX.class)
- 安全增强:
- 基于AES的加密算法:
PEBWithSHA256AndAES_128
- 客户端默认启动TLS1.2和TLS1.1、系统属性jdk.tls.client.protocols
- Keystore增强
- 支持安全的随机数生成器:SecureRandom.getInstanceStrong
- JSSE服务端支持SNI
- 默认禁用安全性差的加密算法:例如DES相关的Kerberos5
- 基于AES的加密算法:
- NIO改进:
- 改进了java.nio.charset.Charset实现
- 优化了String.getBytes性能
- 新增API:BufferedReader.line()/File.lines(Path,Charset)/File.list(Path)/File.walk(Path,int,FileVisitOption)/Find.find(…)
- 全球化功能:
- 支持新的Unicode 6.2.0标准
- 新增日历和本地化API
- 改进了日期时间的管理
- IDE:
- Eclipse Kepler 4.3.2 默认支持Java8