1.JAVA9新特性
java9发布于17年9月,主要改动是引入模块化等。
1.1. 模块化
java9引入了模块化(Project Jigsaw),Maven就是一个模块化构建工具。把一个大的项目分成若干个模块,模块之间通过不同的依赖关系组织在一起。
模块声明文件module-info.java示例:
module com.mycompany.sample {
exports com.mycompany.sample;
requires com.mycompany.common;
provides com.mycompany.common.DemoService with
com.mycompany.sample.DemoServiceImpl;
}
主要由三部分组成:
1)exports:模块导出的包
2)requires:模块需要的包
3)provides:模块提供的服务
1.2. Jshell
java9增加了jshell,通过jshell可以自定义函数,可用于简单的计算、打印、循环等。
自定义函数示例:
jshell> int add(int x, int y) {
return x + y;
}
1.3. Nashorn
Nashorn 是 Java 8 中引入的新的 JavaScript 引擎。Java 9 中的 Nashorn 实现了一些 ECMAScript 6 规范中的新特性。
1.4. 集合、Stream 和 Optional
在集合上,Java 9 增加 了 List.of()、Set.of()、Map.of() 和 M ap.ofEntries()等工厂方法来创建不可变集合。
Stream 中增加了新的方法 ofNullable、dropWhile、takeWhile 和 iterate。
Optiona l 类中新增了 ifPresentOrElse、or 和 stream 等方法。
java.util.Properties中引入了ConcurrentHashMap。
1.5. InputStream
InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据。
1)readAllBytes:读取 InputStream 中的所有剩余字节。
2)readNBytes: 从 InputStream 中读取指定数量的字节到数组中。
3)transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中 。
2.JAVA8新特性
2.1. lambda
语法: (paramList) -> functionBody
例:Collections.sort(a, (t1,t2) -> t1.compareTo(t2))
2.2. 方法引用
方法引用可以直接引用已有Java类或实例(实例)的方法或构造器。
语法:Clzz :: fun
例:String::concat
2.3. 函数式接口
如果一个接口只定义了一个方法,则称为
函数式接口,可用@FunctionalInterface标识(非必须,JVM自动识别)
2.4. 接口增强
接口允许有默认实现(default标识),允许有静态方法(static)
2.5. stream API
Collection接口新增stream API,提供了一些聚合函数可用于数据筛选、统计等
主要方法:
Stream.filter(Predicate<? super T> predicate) 筛选数据
Stream.map(Function<? super T, ? extends R> mapper) 映射数据(例大小写转换等)
Stream.mapToInt(ToIntFunction<? super T> mapper) 映射成IntStream
Stream.reduce(T identity, BinaryOperator<T> accumulator) identity为起始值 return T
Stream.reduce(BinaryOperator<T> accumulator) 合并结果 return Optional
Stream.collect(Collector<? super T, A, R> collector) 转换结果
构造方法:Stream.of(T ... a), Collection.stream(), Arrays.stream(Object[] a)
备注:基于流的操作分为terminal和非terminal,对于terminal操作如reduce、 collect、 min、 max、 count等一个流只能执行一次。
2.6. LongAdder
新增LongAdder,DoubleAdder等原子操作实现类,多线程情况下性能较AtomicLong等更优,只是占用空间较大。
2.7. Optional
新增Optional,可以较为优雅地解决NPT,提供了值为空时获取或设置默认值的函数.
示例:
Optional<Integer> n1 = Optional.of(null); // 为空直接NPT
Optional<Integer> n1 = Optional.ofNullable(666); // 可以为空
int uid = n1.orElse(0); // 为空返回0
2.8. 全球化
支持Unicode6.2,新增LocalDateTime,LocalDate,LocalTime等相关类,简化了日期的格式化、解析、转换等
2.9. HashMap
数据结构由原来的Entry数组 + 链表改为Node数组 + 链表/红黑树
存储结构由原来的哈希表改为当链表长度大于指定阈值(8)时采用红黑树,使得哈希冲突特别严重时map的查询时间复杂度由O(n)变为O(logn),从而在性能上取得提升。
新增foreach方法使用BiConsumer迭代。
2.10.BIO/NIO
新增获取java.util.Stream的方法
Files.list(Path)
Files.lines(Path, Charset)
BufferedReader.line()
改进了nio下Charset的实现,使编码效率和解码效率提升
2.11.注解更新
ElementType中新增TYPE_PARAMETER(局部变量),TYPE_USE(任何地方)
2.12.安全性
支持更强的基于密码的加密算法,如PBEWithSHA256AndAES_128 和
PBEWithSHA512AndAES_256。
KeyStore的增强,包含新的KeyStore类型
随机数生成器SecureRandom的增强
3.JAVA7新特性
3.1. switch支持string
3.2. 类型推理
对通用类型实例的创建提供类型推理示例
Map<String,MyType> foo = new Map<String,MyType>();
Becomes:
Map <String,MyType> foo = new Map<>();
3.3. MultiCatch
Multi Catch 来处理多种异常类型示例
Java 6:
Try {
...
} catch(Exception a){
handle(a);
} catch(Error b) {
handle(b);
}
Java 7:
Try {
…
} catch(Exception | Error a) {
handle(a);
}
3.4. TryWithResource
通过try-with-resource编译器会自动选择时机关闭或释放资源,示例:
Java6:
InputStream in = null;
try{
in = new FileInputream(path);
…
} finally {
if(in != null) {
in.close();
}
}
Java7:
InputStream in = null;
try(InputStream in = new FileInputream(path)){
…
}
3.5. fork/join
fork/join是对分治算法和并行计算的实现,主要思想是通过递归将任务拆分计算,如果任务足够小则才直接计算,否则不断拆分,从而实现并行计算。
通常我们并不直接继承 ForkJoinTask,而是使用RecursiveAction(JDK源码注释中有其使用示例)。
4.JAVA6新特性
4.1. JAVA6新特性概要
Web Services,Scripting(javascript),JDBC 4.0等,JAVA6优化了synchronized(引入了轻量级锁和偏向锁等)。
5.JAVA5新特性
5.1. JAVA5新特性概要
泛型,自动装箱,自动拆箱,类型通配符(如Comparator<? super K>,对元素类型进行限制),枚举,可变参数(如java.util.Arrays#asList),Annotation,foreach,concurrent框架(广义上讲java.util.concurrent包下面的都算,但一般是指java.util.concurrent.Executor系列,是Doug Lea大神的杰作)。
concurrent包下主要代码基本都是since 1.5:
java.util.concurrent.locks.Lock
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.Executor
java.util.concurrent.ExecutorService
java.util.concurrent.ThreadPoolExecutor
以上只是列举个大概,如果有需求要用到相关特性或对某些特性本身感兴趣的同学可以参考下面几篇文章:
https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-9/index.html
https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/index.html
当然,如果英文比较6,还是建议读oracle官方的新特性介绍,因为官方介绍更加准确、全面一些。
本文暂时没有评论,来添加一个吧(●'◡'●)