❤写在前面
❤博客主页:努力的小鳴人
❤系列专栏:JavaSE超详总结😋
❤欢迎小伙伴们,点赞👍关注🔎收藏🍔一起学习!
❤如有错误的地方,还请小伙伴们指正!🌹
🔥系列传送门:JavaSE超详总结😋
【15章Java 8 新特性】最全Java 8新特性 详解【热榜】
【14章Java反射机制】Java Reflection【热榜】
【13章网络编程】鲜为人知网络编程【热榜】
【12章 Java IO流】程序员必看 IO流 详解【热榜】
🍔彩蛋:
🔎牛客网是一个兼具 面经、刷题、求职 的神器,是我们的最佳选择,我用过很不错呢~ 👉点击注册开始刷题
小鸣人因为准备考研,学完C++准备浅练下算法,后续会推出牛客网刷题记录专栏
,到时希望大家多多关注~
Java 9新特性
2017年9月21日
Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等
1. 目录结构的改变
JDK 8 的目录结构
JDK 9 的目录结构
2. 模块化系统: Jigsaw ➜ Modularity
Java 已经发展超过20年,暴露出一些问题:Java 运行环境的膨胀和臃肿;当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长;每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的 API;
模块(module)的概念,其实就是package外再裹一层
,不声明默认就是隐藏。因此,模块化使得代码组织上更安全
模块将由通常的类和新的模块声明文件(module-info.java)组成。该文件是位于java代码结构的顶层,该模块描述符明确地定义了我们的模块需要什么依赖关系,以及哪些模块被外部使用。在exports子句中未提及的所有包默认情况下将封装在模块中,不能在外部使用
要想在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
获取帮助
基本使用
导入指定的包
默认已经导入如下的所有包:(包含java.lang包)
只需按下 Tab 键,就能自动补全代码
查看当前 session 下所有创建过的变量
查看当前 session 下所有创建过的方法
使用/open命令调用:后写文件地址
退出jShell
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. 快速创建只读集合
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. 局部变量类型推断
减少了啰嗦和形式的代码,且对齐了变量名,更易阅读
- 场景一:类实例化时
在声明一个变量时,第一次用于声明变量类型,第二次用于构造器
LinkedHashSet<Integer> set = new LinkedHashSet<>();
- 场景二:返回值类型含复杂泛型结构
Iterator<Map.Entry<Integer, Student>> iterator = set.iterator();
- 场景三:
声明一种变量,它只会被使用一次
Reader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
- 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. 新增字符串处理方法
2. Optional 加强
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++准备浅练下算法,后续会推出牛客网刷题记录专栏
,到时希望大家多多关注~