- 模块化系统
- jShell命令
- 接口的私有方法
- 钻石操作符的使用升级
- 垃圾收集机制
- 语法改进:try语句
- String存储结构变更
- 创建只读集合
- 增强的Stream API
1,Java平台模块化系统:
引入了一种新的Java编程组件模块,它是一个命名的、自描述的代码和数据集合。本质上说,模块(module)的概念,其实就是 package 外再包裹一层,也就是说,用模块来管理各个 package ,通过声明某个 package 暴露,不声明默认就是隐藏。因此模块化是的代码组织上更安全,因为它可以指定哪些部分暴露,哪些部分隐藏。
过程:
① 创建一个 java9demo
的工程,然后在这个工程下面创建 2 个 module。一个 java9A
,一个 java9B
。
② 在 java9A
中创建一个实体类 Person,然后想在 java9B
中引用它,正常情况下是引用不到的,因为是存在两个模块中。
③ 我们在 java9A
模块的 src
目录下新建 module-info.java
文件(这个文件就是所谓的模块化文件)
module java9A {
// 这里 exports 后面跟具体的包名
exports com.hepingfly.bean;
}
④ 我们在 java9B
模块的 src
目录下新建 module-info.java
文件
module java9demo {
// requires 后面跟具体要引入的 module 的名字
requires java9A;
}
⑤ 这样在 java9B
模块中就能引用 java9A
模块暴露出来的实体类了。
public class ModuleTest {
// 我在 java9B 模块中想引用 java9A 模块中的 Person 类
public static void main(String[] args) {
Person person = new Person();
person.setName("hepingfly");
System.out.println(person.getName()); // 打印 hepingfly
}
}
模块化系统是基于jar包
和类
之间存在的,目的在于尽可能的减少jar中多余类的加载,保证整体项目运行时的效率,对于项目运行肯定有一定的积极意义。
2、JShell:
它表示 Java Shell,是大家熟知的 REPL (读取-执行-打印-循环) 形式。利用 jshell 可以在没有创建类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行 Java 代码,无需创建 Java 文件。
基本使用:
① JDK9 以上的版本如果你配置好了环境变量直接在命令行输入 jshell
即可进入交互界面原因是 JDK
的 bin
目录下有 jshell
这个工具)
② 输入命令获得帮助信息
【jshell> /help intro】输入 /help intro获得一些帮助信息
③ 定义变量,计算变量值
④ 定义方法,调用方法
⑤ 导入指定的包
【jshell> import java.util.*】可以通过import命令导入指定的包
【jshell> /imports】查看默认导入了哪些包
⑥ 列出当前 session 内所有有效的代码片段
【jshell> /list】判断当前session内所有有效的代码片段
⑦ 查看当前 session 下所有创建过的变量
【jshell> /var】
⑧ 查看当前 session 下所有创建过的方法
【jshell> /methods】
⑨ 从外部文件加载源代码
源代码:
// hello.java 文件中的内容
public void hello() {
System.out.println("hello hepingfly");
}
hello();
⑩ 退出 jshell
【jshell> /exit】
注:
jshell
可以使用 tab 键进行自动补全- jshell 可以从文件中加载语句或者将语句保存到文件中
- 在 jshell 中定义相同方法名和参数列表的方法,即为对现有方法的覆盖。
- 在 jshell 中你会发现不会出现编译时异常,因为 jshell 帮你隐藏了。
3,接口的私有方法:
jdk9,允许在接口中使用私有方法。在 Java9 中,接口更加灵活和强大,方法的访问权限修饰符可以声明为 private 的了,此时方法将不会成为你对外暴露的 API 的一部分。
//jdk9:声明私有方法
private void method4(){
System.out.println("私有方法");
}
4,钻石操作符的使用升级
java9 添加了匿名内部类的功能 后面添加了大括号{} 可以做一些细节的操作
Map map9 = new HashMap<>(){};
5,垃圾收集机制
Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合(DefNew + CMS,ParNew + SerialOld,Incremental CMS)
同时把G1设为默认的垃圾回收器实现。替代了之前默认使用的Parallel GC
JVM 有了统一的日志记录系统,可以使用新的命令行选项-Xlog 来控制 JVM 上 所有组件的日志记录。该日志记录系统可以设置输出的日志消息的标签、级别、修饰符和输出目标等。
6,语法改进:try语句
在 Java9 中可以在 try 子句中使用已经初始化过的资源。
public void testJava() {
/**
* 可以在 try 后面的小括号中调用已经实例化好的资源对象
* 多个资源对象以分号分隔
*/
InputStreamReader is = new InputStreamReader(System.in);
OutputStreamWriter os = new OutputStreamWriter(System.out);
try (is;os) {
System.out.println(is.read());
} catch (Exception e) {
e.printStackTrace();
}
}
7,String存储结构变更
String的实现底层由char[] 改为byte[],存储效率变高,调用效率同样变高
@Stable
private final byte[] value;
8,创建只读合集
public static void testJava() {
// 创建一个只读的 list
List list = List.of("heping", "fly");
// 创建一个只读的 set
Set set = Set.of("heping", "fly");
// 创建一个只读的 map
Map map = Map.of("name", "heping", "age", "18");
Map map2 = Map.ofEntries(Map.entry("name", "heping"), Map.entry("age", "12"));
}
9,增强的Stream API
在 Java9 中,Stream API 变的更好,Stream 接口中添加了 4 个新的方法,dropWhile
、 takeWhile
、ofNullable
、 还有个 iterator 方法的新重载方法。
takeWhile
:用于从 Stream 中获取一部分数据,接收一个 predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素。public static void test1() { List
list = Arrays.asList(13,11,45,18,20,16,96); Stream stream = list.stream(); stream.takeWhile((x) -> x < 20).forEach(System.out::println); } dropWhile
:与 takeWhile() 整好相反,dropWhile返回剩余的元素。public static void test2() { List
list = Arrays.asList(13,11,45,18,20,16,96); Stream stream = list.stream(); stream.dropWhile((x) -> x < 20).forEach(System.out::println); } ofNullable
: 可以包含一个非空元素,也可以创建一个空 Stream 。public static void test3() { Stream
stream = Stream.of(1, 2, 3, null); stream.forEach(System.out::println); // 如果只有单个元素,此元素不能为 null,否则报空指针异常 Stream iterate
:重载的方法public static void test4() { // 需要通过 limit 来控制终止 Stream.iterate(0, x -> x + 1).limit(10).forEach(System.out::println); // 这里就可以通过传入一个断言型函数来进行终止 Stream.iterate(0, x -> x < 10, x -> x + 1).forEach(System.out::println); }