java8和java9的对比

一: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() {
	@Override
	public 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"); // false

Predicate 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 中包含的数据。


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值