引入了一种新的Java编程组件模块,它是一个命名的、自描述的代码和数据集合。本质上说,模块(module)的概念,其实就是 package 外再包裹一层,也就是说,用模块来管理各个 package ,经过声明某个 package 暴露,不声明默认就是隐藏。所以模块化是的代码组织上更安全,由于它能够指定哪些部分暴露,哪些部分隐藏。java
过程:shell
① 建立一个 java9demo
的工程,而后在这个工程下面建立 2 个 module。一个 java9A
,一个 java9B
。编程
② 在 java9A
中建立一个实体类 Person,而后想在 java9B
中引用它,正常状况下是引用不到的,由于是存在两个模块中。安全
③ 咱们在 java9A
模块的 src
目录下新建 module-info.java
文件(这个文件就是所谓的模块化文件)session
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中多余类的加载,保证总体项目运行时的效率,对于项目运行确定有必定的积极意义。工具
它表示 Java Shell,是你们熟知的 REPL (读取-执行-打印-循环) 形式。利用 jshell 能够在没有建立类的状况下直接声明变量,计算表达式,执行语句。即开发时能够在命令行里直接运行 Java 代码,无需建立 Java 文件。ui
基本使用:命令行
① 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 键进行自动补全jdk9,容许在接口中使用私有方法。在 Java9 中,接口更加灵活和强大,方法的访问权限修饰符能够声明为 private 的了,此时方法将不会成为你对外暴露的 API 的一部分。
//jdk9:声明私有方法 private void method4(){ System.out.println("私有方法"); }
java9 添加了匿名内部类的功能 后面添加了大括号{} 能够作一些细节的操做
Map<String,String> map9 = new HashMap<>(){};
Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合(DefNew + CMS,ParNew + SerialOld,Incremental CMS)
同时把G1设为默认的垃圾回收器实现。替代了以前默认使用的Parallel GC
JVM 有了统一的日志记录系统,可使用新的命令行选项-Xlog 来控制 JVM 上 全部组件的日志记录。该日志记录系统能够设置输出的日志消息的标签、级别、修饰符和输出目标等。
在 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(); } }
String的实现底层由char[] 改成byte[],存储效率变高,调用效率一样变高
@Stable private final byte[] value;
public static void testJava() { // 建立一个只读的 list List<String> list = List.of("heping", "fly"); // 建立一个只读的 set Set<String> set = Set.of("heping", "fly"); // 建立一个只读的 map Map<String, String> map = Map.of("name", "heping", "age", "18"); Map<String, String> map2 = Map.ofEntries(Map.entry("name", "heping"), Map.entry("age", "12")); }
在 Java9 中,Stream API 变的更好,Stream 接口中添加了 4 个新的方法,dropWhile
、 takeWhile
、ofNullable
、 还有个 iterator 方法的新重载方法。
takeWhile
:用于从 Stream 中获取一部分数据,接收一个 predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽可能多的元素。
public static void test1() { List<Integer> list = Arrays.asList(13,11,45,18,20,16,96); Stream<Integer> stream = list.stream(); stream.takeWhile((x) -> x < 20).forEach(System.out::println); }
dropWhile
:与 takeWhile() 整好相反,dropWhile返回剩余的元素。
public static void test2() { List<Integer> list = Arrays.asList(13,11,45,18,20,16,96); Stream<Integer> stream = list.stream(); stream.dropWhile((x) -> x < 20).forEach(System.out::println); }
ofNullable
: 能够包含一个非空元素,也能够建立一个空 Stream 。
public static void test3() { Stream<Integer> stream = Stream.of(1, 2, 3, null); stream.forEach(System.out::println); // 若是只有单个元素,此元素不能为 null,不然报空指针异常 Stream<Object> stream1 = Stream.of(null); // Java9 新增 ofNullable 容许单个元素为空 Stream<Object> stream2 = Stream.ofNullable(null); System.out.println(stream2.count()); // 0 }
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); }