可以看到 Java 9 前后的对比:
// Java 9 之前 List<String> list = new ArrayList<>(); list.add("公众号"); list.add("我没有三颗心脏"); list.add("关注走起来"); List<String> unmodifiableList = Collections.unmodifiableList(list); // 或者使用 {{}} 的形式 List<String> list = new ArrayList<>() {{ add("公众号"); add("我没有三颗心脏"); add("关注走起来"); }}; List<String> unmodifiableList = Collections.unmodifiableList(list); // Java 9 便捷的工厂方法 List<String> unmodifiableList = List.of("公众号", "我没有三颗心脏", "关注走起来");(ps: Set、Map 类似,Map 有两组方法:of() 和 ofEntries() 分别用于创建 Immutable Map 对象和 Immutable Map.Entry 对象)
另外 Java 9 可以直接输出集合的内容,在此之前必须遍历集合才能全部获取里面的元素,这是一个很大的改进。
不可变集合的特征不可变即不可修改。它们通常具有以下几个特征:
1、我们无法添加、修改和删除其元素;
2、如果尝试对它们执行添加/删除/更新操作,将会得到 UnsupportedOperationException 异常,如下所示:
jshell> immutableList.add("Test") | java.lang.UnsupportedOperationException thrown: | at ImmutableCollections.uoe (ImmutableCollections.java:68) | at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:74) | at (#2:1)3、不可变集合不允许 null 元素;
4、如果尝试使用 null 元素创建,则会报出 NullPointerException 异常,如下所示:
jshell> List>String> immutableList = List.of("公众号","我没有三颗心脏","关注走起来", null) | java.lang.NullPointerException thrown: | at Objects.requireNonNull (Objects.java:221) | at ImmutableCollections$ListN. (ImmutableCollections.java:179) | at List.of (List.java:859) | at (#4:1)5、如果尝试添加 null 元素,则会得到 UnsupportedOperationException 异常,如下所示:
jshell> immutableList.add(null) | java.lang.UnsupportedOperationException thrown: | at ImmutableCollections.uoe (ImmutableCollections.java:68) | at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:74) | at (#3:1)6、如果所有元素都是可序列化的,那么集合是可以序列化的;
三. 模块系统Java 模块系统是 Oracle 在 Java 9 引入的全新概念。最初,它作为 Java SE 7 Release 的一部分启动了该项目,但是由于进行了很大的更改,它被推迟到了 Java SE 8,然后又被推迟了。最终随着 2017 年 9 月发布的 Java SE 9 一起发布。
为什么需要模块系统?当代码库变得更大时,创建复杂、纠结的 “意大利面条代码” 的几率成倍增加。在 Java 8 或更早版本交付 Java 应用时存在几个基本问题:
难以真正封装代码,并且在系统的不同部分(JAR 文件)之间没有显式依赖关系的概念。每个公共类都可以由 classpath 上的任何其他公共类访问,从而导致无意中使用了本不应该是公共 API 的类。
再者,类路径本身是有问题的:您如何知道是否所有必需的 JAR 都存在,或者是否存在重复的条目?
另外,JDK 太大了,rt.jar (rt.jar 就是 Java 基础类库——也就是 Java Doc 里面看到的所有类的 class 文件)等 JAR 文件甚至无法在小型设备和应用程序中使用:因此我们的应用程序和设备无法支持更好的性能——打包之后的应用程序太大了——也很难测试和维护应用程序。
模块系统解决了这几个问题。
什么是 Java 9 模块系统?模块就是代码、数据和一些资源的自描述集合。它是一组与代码、数据和资源相关的包。
每个模块仅包含一组相关的代码和数据,以支持单一职责原则(SRP)。
Java 9 模块系统的主要目标就是支持 Java 模块化编程。(我们将在下面