一:Java9比Java8的改进

1)引入了模块系统:采用模块化系统,这样的话这些应用程序只需要所需的那部分JDK模块, 而非是整个JDK框架了,减少了内存的开销

2)引入了一个新的package:java.net.http;提供了对Http访问很好的支持,不仅支持 Http1.1而且还支持HTTP2

3)引入了jshell这个交互性工具,让Java也可以像脚本语言一样来运行,可以从控制台启动 jshell ,在jshell 中直接输入表达式并查看其执行结果。

4)增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法来创建不可变集合

5)新增了HTML5风格的Java帮助文档

6)多版本兼容 JAR 功能,能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本。

7)统一 JVM 日志:可以使用新的命令行选项-Xlog 来控制JVM 上 所有组件的日志记录。该日志记录系统可以设置 输出的日志消息的标签、级别、修饰符和输出目标等。

8)垃圾收集机制 :移除了在 Java 8 中被废弃的垃圾回收器配置组合;同时把G1设为默认的垃圾回收器实现,这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能

9)I/O 流新特性 java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据。

  1. readAllBytes:读取 InputStream 中的所有剩余字节。
  2. readNBytes: 从 InputStream 中读取指定数量的字节到数组中。
  3. transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中 。

二:JAVA8 十大新特性

2.1 接口的默认方法

Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可

interface Formula {double calculate(int a);default double sqrt(int a) {return Math.sqrt(a);}
}

2.2 Lambda 表达式

老版本的Java中是如何排列字符串,代码如下所示

List names = Arrays.asList("peterF", "anna", "mike", "xenia");
Collections.sort(names, new Comparator() {@Overridepublic int compare(String a, String b){return b.compareTo(a);}
});

Java 8提供了更简洁的语法,lambda表达
式,代码如下所示

Collections.sort(names, (String a, String b) -> {return b.compareTo(a);
});

Collections.sort(names, (String a, String b) -> b.compareTo(a));

Collections.sort(names, (a, b) -> b.compareTo(a));

2.3 函数式接口

“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保该接口一定达到这个要求,只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
示例代码

@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

2.4 方法与构造函数引用

2.3的代码还可以通过静态方法引用来表示,如下所示
如何引用一个静态方法:

Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted); // 123

Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用;也可以引用一个对象的方法:

converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted); // "J"

2.5 Lambda 作用域

在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。

可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量

2.6 访问局部变量

可以直接在lambda表达式中访问外层的局部变量:

final int num = 1;
Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num);
stringConverter.convert(2); // 3

是和匿名对象不同的是,这里的变量num可以不用声明为final,

int num = 1;
Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num);
stringConverter.convert(2); // 3

这里的num必须不可被后面的代码修改(即隐性的具有final的语义)

在lambda表达式中试图修改num同样是不允许的。

2.7 访问对象字段与静态变量

lambda内部对于实例的字段以及静态变量是即可读又可写。

2.8 访问接口的默认方法

Lambda表达式中是无法访问到默认方法的

Predicate接口

Predicate 接口只有一个参数,返回boolean类型。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非):

Predicate predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // falsePredicate nonNull = Objects::nonNull;
Predicate isNull = Objects::isNull;
Predicate isEmpty = String::isEmpty;
Predicate isNotEmpty = isEmpty.negate();

Function 接口

Function 接口有一个参数并且返回一个结果,并附带了一些可以和其他函数组合的默认方法(如:compose, andThen)

Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"

Supplier 接口

Supplier 接口返回一个任意范型的值,和Function接口不同的是该接口没有任何参数

Supplier personSupplier = Person::new;
personSupplier.get(); // new Person

Consumer 接口

Consumer 接口表示执行在单个参数上的操作。

Consumer greeter = (p) -> System.out.println("Hello, " + p.firstName);
greeter.accept(new Person("Luke", "Skywalker"));

Comparator 接口

Comparator 是老Java中的经典接口, Java 8在此之上添加了多种默认方法

Optional 接口

用来防止NullPointerException异常的辅助类型

Optional 被定义为一个简单的容器,其值可能是null或者不是null。

Optional optional = Optional.of("bam");
optional.isPresent(); // true
optional.get(); // "bam"
optional.orElse("fallback"); // "bam"
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b"

Stream 接口

java.util.Stream 表示能应用在一组元素上一次执行的操作序列


2.9 Date API

有一些新的API,重要的如下

Clock 时钟

Clock类提供了访问当前日期和时间的方法,

Clock是时区敏感的,可以用来取代
System.currentTimeMillis() 来获取当前的微秒数。

某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象


Timezones 时区

时区使用ZoneId来表示
时区定义了到UTS时间的时间差,在Instant时间点对象到本地日期对象之间转换的时候是极其重要的


LocalTime 本地时间

LocalTime 定义了一个没有时区信息的时间,例如 晚上10点,或者 17:30:15。


LocalDate 本地日期

LocalDate 表示了一个确切的日期,比如 2014-03-11。该对象值是不可变的,用起来和LocalTime基本一致。


LocalDateTime 本地日期时间

LocalDateTime 同时表示了时间和日期,相当于前两节内容合并到一个对象上了。

LocalDateTime和LocalTime还有LocalDate一样,都是不可变的。

LocalDateTime提供了一些能访问具体字段的方法。

2.10 Annotation 注解

三:Java 9 十大新特性

3.1 modularity System 模块系统

JDK 被重新组织成 94 个模块。

Java 应用可以通过新增的 jlink 工具,创建出只包含所依赖的 JDK 模块的自定义运行时镜像。

极大的减少 Java 运行时环境的大小,使得JDK可以在更小的设备中使用。

采用模块化系统的应用程序只需要这些应用程序所需的那部分JDK模块,而非是 整个JDK框架了。


3.2 HTTP/2

引入了一个新的package:java.net.http,里面提供了对Http访问很好的支持,不仅支持Http1.1而且还支持HTTP2,以及WebSocket


3.3 JShell

jshell交互性工具,让Java也可以像脚本语言一样来运行

Jshell 也有基本的代码完成功能


3.4 不可变集合工厂方法

Java 9增加了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);

在创建后,继续添加元素到这
些集合会导致 “UnsupportedOperationException” 。

3.5 私有接口方法

默认方法和静态方法可以共享接口中的私有方法,因此避免了代码冗余,这也使代码更加清晰。


3.6 HTML5风格的Java帮助文档


3.7 多版本兼容 JAR

当一个新版本的 Java 出现的时候,你的库用户要花费很长时间才会切换到这个新的版本。

这就意味着库要去向后兼容你想要支持的最老的 Java 版本 (许多情况下就是 Java 6 或者 7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。

但是java9 ,提供了多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本


3.8 统一 JVM 日志

JVM 有了统一的日志记录系统,可以使用新的命令行选项-Xlog 来控制 JVM 上 所有组件的日志记录。

该日志记录系统可以设置输出的日志消息的标签、级别、修饰符和输出目标等。


3.9 java9的垃圾收集机制

移除了被java8废弃的垃圾回收器配置组合,同时把G1设为默认的垃圾回收器实现

使用G1:将会为应用线程带来额外的工作,从而直接影响到应用的性能


3.10 I/O 流新特性

java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据。


java8和java9的对比相关推荐

  1. 简介java5、java6、java7、java8、java9

    1. 介绍 JAVA作为使用的主力语言,掌握下其历史发展也是有必要的.看看从JAVA5开始到现在的JAVA9有哪些变化.借此机会,也可以看看哪些特性我们是已经用到的,哪些是还没有用到的. 我们在IDE ...

  2. 【java基础】快速掌握 Java5、Java6、Java7、Java8、Java9 的新特性!!!

    1. 介绍 JAVA作为使用的主力语言,掌握下其历史发展也是有必要的.看看从JAVA5开始到现在的JAVA9有哪些变化.借此机会,也可以看看哪些特性我们是已经用到的,哪些是还没有用到的. 如果有程序猿 ...

  3. java8,java9和java11的特性和区别!

    java 8的主要特性 1. Lambda 表达式 Lambda 允许把函数作为一个方法的参数传递进方法中. 作用:解决 Java 被诟病的匿名内部类的问题. 2. 接口中可增加了默认方法 作用:在接 ...

  4. Java8 和 Java9 的主要新特性

    Java 8 的主要新特性 1. Lambda 表达式 Lambda 允许把函数作为一个方法的参数传递进方法中. 作用:解决 Java 被诟病的匿名内部类的问题. 2. 接口中可增加了默认方法 作用: ...

  5. java9系列(八)Multi-Release JAR Files

    为什么80%的码农都做不了架构师?>>>    序 本文主要研究下JEP 238: Multi-Release JAR Files multi-release jar (MR JAR ...

  6. Java8学习系列之匿名函数Lambda

    Lambda介绍 Lambda,别名函数式编程,维基百科给出以下介绍: 函数式编程是一种编程范式.它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据.它是一种声明式的编程范式,通过表达式和声 ...

  7. macOS卸载Java9及利用Homebrew搭建并配置Java开发环境

    Homebrew(macOS下软件包管理工具)的安装: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Ho ...

  8. 比较全的 Java8 9 lambda 应用

    Java8 9 lambda 学习笔记 /*** 引用类型的赋值是将原来的地址给了另一个引用,它们指向的地址是同一个,如果修改了其中一个,那么就会影响另一个.* 如果我们需要切断两者的联系,可以采用 ...

  9. Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java9 的新特性

    你好,我是看山. 本文收录在 <从小工到专家的 Java 进阶之旅> 系列专栏中. 从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证 ...

最新文章

  1. retinaface验证
  2. ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集...
  3. 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续
  4. 曾经觉得学习晦涩难懂的我是如何爱上linux的
  5. ## 7.3 奇异值分解的几何意义
  6. linux操作系统桌面应用与管理第2版,linux操作系统桌面应用与管理(62页)-原创力文档...
  7. JQ中使用FormData+Ajax发送请求及使用express接收处理FormData数据
  8. 217 Contains Duplicate
  9. 【Flink】FLink checkpont 界面显示的含义
  10. K3s(Kubernetes)环境使用Let‘s Encrypt证书的部署及自动配置https域名-阿里云域名解析管理
  11. php api权限,如何设计RESTful的API权限
  12. 李庄 220kV变电站电气部分初步设计
  13. coreldraw快速撤回_CorelDRAW X7撤销、重做和重复操作
  14. 【电子设计大赛】2017 年全国大学生电子设计竞赛 仪器和主要元器件清单
  15. 无法安装NET Framework3.5错误代码0x800F081F
  16. android添加nfc门禁卡,IOS14nfc怎么添加门禁卡?NFC门禁卡教程[多图]
  17. dbf shp shx sbn sbx mdb adf等类型的文件的解释
  18. 公众号服务器配置如何不显示,公众号服务器配置信息怎么设置
  19. php 批量删除注释,PHP-php做一个程序高效去除注释的方法
  20. Oracle中设置定时任务--执行sql

热门文章

  1. 计算机片段教学优秀教案,高中数学片段教学方法
  2. 电脑便签小工具分享 居然可以这般贴心好用
  3. 悔不当初:没人能随随便便成功
  4. 关于jQuery(二)
  5. “CSDN 2022 中国开发者影响力年度评选”正式开启报名!
  6. html 苹果app安装app,未越狱的苹果手机如何安装非App Store的应用?
  7. 通俗易懂理解——双向LSTM
  8. ubc 文学院 计算机,UBC大学电气与计算机教授获加拿大国家最高科学奖
  9. 巨富笔记:上者劳人,中者劳智,下者劳力
  10. R语言 数据正态化+标准化