java8与java9新特性比较
属性 | java8之前 | java8 | java9 | ||
接口 | 接口不可以创建构造器,其中方法全为抽象方法 接口的成员变量均用public修饰 | 允许在接口添加非抽象方法,使用defalut关键字即可 | 可私有接口的方法 ,默认和静态方法更好的共享接口的私有方法, 若私有方法为静态该方法属于这个接口, 不为静态则只能被该接口的实例调用 | ||
public interface NameOfInterface{ //任何类型 final, static 字段 //抽象方法 } | interface Formula { double calculate(int a); default double sqrt(int a) { | interface InterfaceWithPrivateMethods { private static String staticPrivate() { return “static private”; } private String instancePrivate() { return “instance private”; } default void check() { String result = staticPrivate(); InterfaceWithPrivateMethods pvt = new InterfaceWithPrivateMethods() { // anonymous class 匿名类 }; result = pvt.instancePrivate(); } } |
属性 | java8之前 | java8 | java9 |
Lambda 表达式java中是如何排列字符串的 | List<String> names = Arrays.asList(“peter”, “anna”, “mike”, “xenia”); Collections.sort(names, new Comparator<String>() { | Collections.sort(names, (String a, String b) -> { return b.compareTo(a); }); 或者 Collections.sort(names, (String a, String b) -> b.compareTo(a)); | * |
函数式接口 “函数式接口”是 指仅仅只包含一个抽象方法的接口 ,每一个该类型的lambda表达式都会 被匹配到这个抽象方法 | * | @FunctionalInterface interface Converter<F, T> { T convert(F from); } Converter<String, Integer> converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert(“123”); System.out.println(converted); // 123 | * |
允许使用 :: 关键字来 传递方法或者构造函数引用 | * | converter = something::startsWith; String converted = converter.convert(“Java”); System.out.println(converted); // “J” | * |
Lambda 作用域 | * | 直接访问标记了final的外层局部变量,或者实例的字段以及静态变量 | * |
访问局部变量 可以直接在lambda表达式中访问外层的局部变量 | * | final int num = 1; Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num); stringConverter.convert(2); // 3 | * |
访问对象字段与静态变量 和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写 | * | class Lambda4 { static int outerStaticNum; int outerNum; void testScopes() { Converter<Integer, String> stringConverter2 = (from) -> { | * |
访问接口的默认方法 | Comparator或者Runnable接口 | Predicate接口,Function接口,supplier接口 Consumer 接口,Comparator接口添加默认的方法,Optional接口,Stream接口,Filter过滤, sort排序,Map映射,Math匹配,Count计数,Reduce规约,并行Streams,Map.putIfAbsent(), | * |
java.time下包含了一组全新的时间日期API | * | Clock类提供了访问当前日期和时间的方法, Timezones 时区,LocalTime 本地时间, LocalDate 本地日期,LocalDateTime本地日期时间, | * |
Annotation 注解 在Java 8中支持多重注解了 | 老方法 @Hints({@Hint(“hint1”), @Hint(“hint2”)}) class Person {} | 把同一个类型的注解使用多次, 只需要给该注解标注一下@Repeatable即可 @interface Hints { Hint[] value(); } @Repeatable(Hints.class) | * |
modularity System 模块系统 | * | * | modularity System 模块系统 |
引入了新的package:java.net.http | * | * | * |
引入了jshell这个交互性工具 | * | * | java9引入了jshell这个交互性工具, 让Java也可以像脚本语言一样来运行, 可以从控制台启动 jshell , 在 jshell 中直接输入表达式并查看其执行结果。 当需要测试一个方法的运行效果, 或是快速的对表达式进行求值时,jshell 都非常实用。 除了表达式之外,还可以创建 Java 类和方法。 jshell 也有基本的代码完成功能。 |
不可变集合工厂方法 增加了List.of()、Set.of()、Map.of()和Map.ofEntries() 等工厂方法来创建不可变集合 | * | * | List strs = List.of(“Hello”, “World”); List strs List.of(1, 2, 3); Set strs = Set.of(“Hello”, “World”); Set ints = Set.of(1, 2, 3); Map maps = Map.of(“Hello”, 1, “World”, 2); |
HTML5风格的Java帮助文档 | * | * | Java帮助文档还是由三个框架组成的结构构成, 并且以HTML 5输出的Java帮助文档也保持相同的结构。 每个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。 |
多版本兼容 JAR | * | * | 当一个新版本的 Java 出现的时候, 你的库用户要花费很长时间才会切换到这个新的版本。 这就意味着库要去向后兼容你想要支持的最老的 Java 版本 (许多情况下就是 Java 6 或者 7)。 这实际上意味着未来的很长一段时间, 你都不能在库中运用 Java 9 所提供的新特性。 而多版本兼容 JAR 功能能 让你创建仅在特定版本的 Java 环境中 运行库程序时选择使用的 class 版本: |
统一 JVM 日志 | * | * | Java 9 中 ,JVM 有了统一的日志记录系统, 可以使用新的命令行选项-Xlog 来控制 JVM 上 所有组件的日志记录。 该日志记录系统可以设置输出的日志消息 的标签、级别、修饰符和输出目标等。 |
java9的垃圾收集机制 | * | * | Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合, 同时把G1设为默认的垃圾回收器实现. 因为相对于Parallel来说, G1会在应用线程上做更多的事情, 而Parallel几乎没有在应用线程上做任何事情, 它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能. |
I/O 流新特性 | * | * | java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据。 readAllBytes:读取 InputStream 中的所有剩余字节。 readNBytes: 从 InputStream 中读取指定数量的字节到数组中。 transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中 。 等等 |
java8新特性: http://www.jb51.net/article/48304.htm
java9 新特性: http://blog.csdn.net/mxw2552261/article/details/79080678