【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性

❤写在前面
❤博客主页:努力的小鳴人
❤系列专栏:JavaSE超详总结😋
❤欢迎小伙伴们,点赞👍关注🔎收藏🍔一起学习!
❤如有错误的地方,还请小伙伴们指正!🌹

🔥系列传送门JavaSE超详总结😋
【15章Java 8 新特性】最全Java 8新特性 详解【热榜】
【14章Java反射机制】Java Reflection【热榜】
【13章网络编程】鲜为人知网络编程【热榜】
【12章 Java IO流】程序员必看 IO流 详解【热榜】

🍔彩蛋:
🔎牛客网是一个兼具 面经、刷题、求职 的神器,是我们的最佳选择,我用过很不错呢~ 👉点击注册开始刷题
小鸣人因为准备考研,学完C++准备浅练下算法,后续会推出牛客网刷题记录专栏,到时希望大家多多关注~

文章目录

  • Java 9新特性
    • 1. 目录结构的改变
    • 2. 模块化系统: Jigsaw ➜ Modularity
    • 3. Java的REPL工具: jShell命令
    • 4. 接口的私有方法
    • 5. 语法改进:try语句、钻石操作符使用升级
    • 6. String存储结构变更
    • 7. 快速创建只读集合
    • 8. InputStream 加强
    • 9. 增强的 Stream API
    • 10. Javascript引擎升级:Nashorn
  • Java 10新特性
    • 1. 局部变量类型推断
    • 2. 新增创建不可变集合方法
  • Java 11新特性
    • 1. 新增字符串处理方法
    • 2. Optional 加强
    • 3. 局部变量类型推断升级
    • 4. 全新的HTTP 客户端API
    • 5. ZGC
    • 6. 更简化的编译运行程序 和 废弃Nashorn引擎

Java 9新特性

2017年9月21日

Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等

1. 目录结构的改变

JDK 8 的目录结构
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
JDK 9 的目录结构
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性

2. 模块化系统: Jigsaw ➜ Modularity

Java 已经发展超过20年,暴露出一些问题:Java 运行环境的膨胀和臃肿;当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长;每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的 API;

模块(module)的概念,其实就是package外再裹一层,不声明默认就是隐藏。因此,模块化使得代码组织上更安全
模块将由通常的类和新的模块声明文件(module-info.java)组成。该文件是位于java代码结构的顶层,该模块描述符明确地定义了我们的模块需要什么依赖关系,以及哪些模块被外部使用。在exports子句中未提及的所有包默认情况下将封装在模块中,不能在外部使用
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性

要想在java9test模块中调用 Person模块下包中的结构,需要在Person 的module-info.java中声明:

/**
* @author 努力的小鸣人
* @create 2022 下午 15:00
*/
module Person {
	//package we export
	exports //类所在包名
}

exports:控制着哪些包可以被其它模块访问到。所有不被导出的包默认都被封装在模块里面
对应在java9test 模块的src 下创建module-info.java文件:

/**
* @author 努力的小鸣人
* @create 2022 下午 15:09
*/
module java9test {
	requires Person;
}

requires:指明对其它模块的依赖

3. Java的REPL工具: jShell命令

Java 9 中终于拥有了 REPL工具:jShell。让Java可以像脚本语言一样运行,从控制台启动jShell,利用jShell在没有创建类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行Java的代码

调出jShell
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
获取帮助
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
基本使用
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
导入指定的包
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
默认已经导入如下的所有包:(包含java.lang包)
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
只需按下 Tab 键,就能自动补全代码
查看当前 session 下所有创建过的变量
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
查看当前 session 下所有创建过的方法
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
使用/open命令调用:后写文件地址
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性
退出jShell
【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性

4. 接口的私有方法

在Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法和默认的方法
在Java 9中方法的访问权限修饰符可以声明为 private

interface MyInterface {
	void normalInterfaceMethod();
	default void methodDefault1() {
		timi();
	}
	public default void methodDefault2() {
		timi();
	}

	private void timi() {
		System.out.println("私有");
	}
}

5. 语法改进:try语句、钻石操作符使用升级

Java 9 中我们可以在try子句中使用已经初始化过的资源,此时的资源是final的

InputStreamReader reader = new InputStreamReader(System.in);
OutputStreamWriter writer = new OutputStreamWriter(System.out);
try (reader; writer) {
	//reader是final的,不可再被赋值
	//...
} catch (IOException e) {
	e.printStackTrace();
}

能够与匿名实现类共同使用钻石操作符

Comparator<Object> com = new Comparator<>(){
		@Override
		public int compare(Object o1, Object o2) {
			return 0;
		}
};

6. String存储结构变更

String 不用 char[] 来存储啦,改成了 byte[] 加上编码标记

public final class String
	implements java.io.Serializable, Comparable<String>, CharSequence {
		@Stable
		private final byte[] value;
}

7. 快速创建只读集合

【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性

8. InputStream 加强

增加方法:transferTo
可以用来将数据直接传输到 OutputStream

ClassLoader cl = this.getClass().getClassLoader();
try (InputStream is = cl.getResourceAsStream("hello.txt");
		OutputStream os = new FileOutputStream("src\\hello1.txt")) {
	is.transferTo(os); // 把输入流中的所有数据直接自动地复制到输出流中
} catch (IOException e) {
	e.printStackTrace();
}

9. 增强的 Stream API

添加了 4个新的方法:takeWhile, dropWhile, ofNullable,还有 iterate方法的新重载方法
takeWhile()返回从开头开始的尽量多的元素
dropWhile()返回剩余的元素

List<Integer> list = Arrays.asList(45, 43, 76, 87, 42, 77, 90, 73, 67, 88);
list.stream().takeWhile(x -> x < 50).forEach(System.out::println);

list.stream().dropWhile(x -> x < 50).forEach(System.out::println);

ofNullable()创建一个单元素 Stream,可以包含一个非空元素或空的
iterate()重载

// 原来的控制终止方式:
Stream.iterate(1, i -> i + 1).limit(10).forEach(System.out::println);
// 现在的终止方式:
Stream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个(可能是空的) Stream 对象

stream()使用:

List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Jack");

Optional<List<String>> optional = Optional.ofNullable(list);
Stream<List<String>> stream = optional.stream();
stream.flatMap(x -> x.stream()).forEach(System.out::println);

10. Javascript引擎升级:Nashorn

JDK 9 包含一个用来解析 Nashorn 的 ECMAScript 语法树的 API。这个 API 使得IDE 和服务端框架不需要依赖 Nashorn 项目的内部实现类,就能够分析ECMAScript 代码

Java 10新特性

2018年3月21日

1. 局部变量类型推断

减少了啰嗦和形式的代码,且对齐了变量名,更易阅读

  1. 场景一:类实例化时
    在声明一个变量时,第一次用于声明变量类型,第二次用于构造器
LinkedHashSet<Integer> set = new LinkedHashSet<>();
  1. 场景二:返回值类型含复杂泛型结构
Iterator<Map.Entry<Integer, Student>> iterator = set.iterator();
  1. 场景三:
    声明一种变量,它只会被使用一次
Reader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
  1. var
    适用于以下情况:
//1.局部变量的初始化
	var list = new ArrayList<>();
//2.增强for循环中的索引
	for(var v : list) {
	System.out.println(v);
	}
//3.传统for循环中
	for(var i = 0;i < 100;i++) {
	System.out.println(i);
	}

不适用以下的结构中:
●没有初始化的局部变量声明
●方法的返回类型
●方法的参数类型
●构造器的参数类型
●属性
●catch块

2. 新增创建不可变集合方法

copyOf 方法:创建不可变的集合
copyOf 方法会先判断来源集合是不是不可变AbstractImmutableList 类型的,如果是,就直接返回,如果不是,而调用 of 方法是创建一个新的集合

注🎁:使用of和copyOf创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常

List ,Set ,Map 接口都有这俩方法

Java 11新特性

JDK 11 是一个长期支持版本(LTS, Long-Term-Support)

1. 新增字符串处理方法

【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性

2. Optional 加强

【16章Java 9 10 11新特性】Java9 &Java10 & Java11新特性

3. 局部变量类型推断升级

在var上添加注解的语法格式

Consumer<String> con2 = (@Deprecated var t) ->
System.out.println(t.toUpperCase());

4. 全新的HTTP 客户端API

用于传输网页的协议
java.net 包中
将替代仅适用于blocking 模式的 HttpURLConnection,并提供对WebSocket 和HTTP/2的支持

HttpClient client = HttpClient.newHttpClient();
HttpRequest request =
HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/test/")).build();
BodyHandler<String> responseBodyHandler = BodyHandlers.ofString();
HttpResponse<String> response = client.send(request, responseBodyHandler);
String body = response.body();
System.out.println(body);

JDK11后

HttpClient client = HttpClient.newHttpClient();
HttpRequest request =
HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/test/")).build();
BodyHandler<String> responseBodyHandler = BodyHandlers.ofString();
CompletableFuture<HttpResponse<String>> sendAsync =
client.sendAsync(request, responseBodyHandler);
sendAsync.thenApply(t -> t.body()).thenAccept(System.out::println);

5. ZGC

是一个并发, 基于region, 压缩型的垃圾收集器, 只有root扫描阶段会STW(stop the world), 因此GC停顿时间不会随着堆的增长和存活对象的增长而变长

优势:
●GC暂停时间不会超过10ms
●既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
●和G1相比, 应用吞吐能力不会下降超过15%
●为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
●初始只支持64位系统

6. 更简化的编译运行程序 和 废弃Nashorn引擎

// 编译
javac Javastack.java
// 运行
java Javastack
在Java 11 版本中,通过一个 java 命令就搞定:
java Javastack.java

废除Nashorn javascript引擎,可以考虑使用GraalVM

🎁总结:熟悉下各版本的新特性更有利于敲代码,新特性中也有很好的
👌 作者算是一名Java初学者,文章如有错误,欢迎评论私信指正,一起学习~~
😊如果文章对小伙伴们来说有用的话,点赞👍关注🔎收藏🍔就是我的最大动力!
🚩不积跬步,无以至千里书接下回,欢迎再见🌹

🍔彩蛋:
🔎牛客网是一个兼具 面经、刷题、求职 的神器,是我们的最佳选择,我用过很不错呢~ 👉点击注册开始刷题
小鸣人因为准备考研,学完C++准备浅练下算法,后续会推出牛客网刷题记录专栏,到时希望大家多多关注~

相关文章

暂无评论

暂无评论...