模块化系统
在Java9版本中,推出了模块化概念。可以让我们编写代码时分模块来开发,避免代码逻辑变得复杂。提高系统的安全性和可维护性。
首先新建两个 Module,分别右键 src 新建 module-info.java 文件

新建完成结构如下

我们将 main2 模块下的 Person 导出,在 main 模块中引入。编写 main2 模块下的 module-infpo.java 文件如下
| 12
 3
 
 | module main2 {exports com.songzx.java9test;
 }
 
 | 
然后在main 模块的 module-infpo.java 文件中导入 main2
| 12
 3
 
 | module main {requires main2;
 }
 
 | 
导入后我们就可以在 main 模块中使用另外一个模块的自定义类
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | package com.songzx.java;
 import com.songzx.java9test.Person;
 
 
 
 
 
 public class java1 {
 public static void main(String[] args) {
 Person p = new Person("lisi",15);
 System.out.println(p);
 }
 }
 
 | 
接口中声明私有方法
在 java9 中可以在接口中声明私有方法,私有方法只能在接口内部使用,外界无法使用。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 
 | package com.songzx.java;
 
 
 
 
 public class java2{
 public static void main(String[] args) {
 MyClass myClass = new MyClass();
 myClass.methodDefault();
 myClass.methodPublic();
 
 
 MyInterface.methodStatic();
 
 
 
 }
 }
 interface MyInterface{
 void methodPublic();
 
 static void methodStatic(){
 System.out.println("接口中的静态方法");
 }
 
 default void methodDefault(){
 System.out.println("我是接口中的默认方法");
 methodPrivate();
 };
 
 
 private void methodPrivate(){
 System.out.println("我的接口中的私有方法");
 }
 }
 
 class MyClass implements MyInterface{
 
 @Override
 public void methodPublic() {
 System.out.println("接口实现类的公共方法");
 }
 
 @Override
 public void methodDefault() {
 System.out.println("接口实现类重写默认方法");
 }
 }
 
 | 
泛型结构特性升级
在 java9 中使用泛型时可以省略第二个尖括号中的数据类型
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | package com.songzx.java;
 import java.util.Comparator;
 
 
 
 
 
 public class java3 {
 public static void main(String[] args) {
 
 Comparator<Object> com = new Comparator<>() {
 @Override
 public int compare(Object o1, Object o2) {
 return 0;
 }
 };
 }
 }
 
 | 
String 底层存储结构变化
在 Java9 之后,String 底层改为使用 byte[] 来存储,节约了一些空间。跟着改变的还要与之相关的 StringBuffer ,StringBuilder
创建只读集合
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | package com.songzx.java;import org.junit.Test;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 
 
 
 
 public class java5 {
 @Test
 public void test1(){
 
 List<Integer> integerList = List.of(1, 2, 3, 4);
 
 System.out.println(integerList);
 
 Set<Integer> set = Set.of(1, 122, 22, 113, 5);
 
 System.out.println(set);
 
 Map<String, String> map = Map.of("name", "lisi", "age", "18");
 System.out.println(map);
 
 }
 }
 
 | 
transferTo 方法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | package com.songzx.java;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 
 
 
 
 
 public class java6 {
 public static void main(String[] args) {
 
 try(FileInputStream fis = new FileInputStream("main/src/hello.txt")){
 FileOutputStream fos = new FileOutputStream("hello_copy.txt");
 
 fis.transferTo(fos);
 }catch (Exception e){
 e.printStackTrace();
 }
 }
 }
 
 | 
Stream 的新增方法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | package com.songzx.java;
 import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Stream;
 
 
 
 
 
 public class java7 {
 public static void main(String[] args) {
 List<Integer> integerList = Arrays.asList(12, 26, 5, 4, 32, 21, 12, 45, 32);
 Stream<Integer> stream = integerList.stream();
 
 
 
 
 stream.dropWhile(i->i<30).forEach(System.out::println);
 }
 
 @Test
 public void test(){
 
 Stream.iterate(0,i-> i + 1).limit(10).forEach(System.out::println);
 
 
 Stream.iterate(0,x->x<10,x->x+1).forEach(System.out::println);
 }
 }
 
 | 
局部变量类型推断
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | package com.songzx.java;
 import org.junit.Test;
 
 import java.util.ArrayList;
 
 
 
 
 
 public class java8 {
 @Test
 public void test(){
 
 var name = "lisi";
 var age = 15;
 
 var strings = new ArrayList<>();
 
 var random = Math.random();
 }
 }
 
 | 
copyof 方法的使用
如果 copyOf(coll) 方法中的 coll 已经是只读的,则返回的还是 coll ,如果 coll 不是只读的,则会新创建一个只读的集合,所以第二个判断中返回 false 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | @Testpublic void test1(){
 var list = List.of(1, 2, 3);
 var list1 = List.copyOf(list);
 System.out.println(list == list1);
 
 var intlist = Arrays.asList(1,2,3);
 var intlist2 = List.copyOf(intlist);
 System.out.println(intlist == intlist2);
 }
 
 | 
字符串新增方法
- isBlank 判断字符串是否为空
- strip 去除字符串首尾空格
- stripTrailing去除尾部空格
- stripLeading去除头部空格
- repeat循环字符串
- lines().count()统计字符串行数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | System.out.println(" \t \t \n ".isBlank());
 
 System.out.println("---" + "\t\tabc\t\t".strip() + "------");
 
 System.out.println("   hello world   ".stripTrailing());
 
 System.out.println("   hello world   ".stripLeading());
 
 System.out.println("java".repeat(5));
 
 
 String desc = "111\n222\n333";
 System.out.println(desc.lines().count());
 
 |