Java – 集合 – 不可变集合

简介

集合在Java中有三种,分别是

List 集合 : 具有索引,顺序存储的集合

Set 集合 : 不具有索引,随机存储的集合

Map 集合 : 不具有索引,但有键值对应关系的集合。

其中,这三种我们都可以通过 set() remove() 等方法对集合数据进行增删改操作,这种集合我们称为可变集合。

而在集合中,也存在不可变集合,也就是不可以被修改的集合,创建出来后,只提供查询或遍历操作。

 

List 不可变集合

创建 List 不可变集合

创建不可变集合不需要创建对象获得,可通过 List 类静态方法创建获得

List.of(E... e)

List 不可变集合一共有12个方法

其中10个方法都是提供不同成员数参数的方法

List.of(E e1)
List.of(E e1, E e2)
List.of(E e1, E e2, E e3)
List.of(E e1, E e2, E e3, E e4)
...
List.of(E e1, E e2, E e3, E e4, E e5, E e6, E e7 ... E e10)

还有一个可变参数

List.of(E... e)

举例

List<String> l = List.of("aaa", "bbb", "ccc", ...)

创建后,如果调用 add() remove() set() 等方法,会报出异常。

 

Set 不可变集合

创建 Set 不可变集合

创建不可变集合不需要创建对象获得,可通过 Set 类静态方法创建获得

Set.of(E... e)

Set 不可变集合一共有12个方法

其中10个方法都是提供不同成员数参数的方法

Set.of(E e1)
Set.of(E e1, E e2)
Set.of(E e1, E e2, E e3)
Set.of(E e1, E e2, E e3, E e4)
...
Set.of(E e1, E e2, E e3, E e4, E e5, E e6, E e7 ... E e10)

还有一个可变参数

Set.of(E... e)

举例

Set<String> s = Set.of("aaa", "bbb", "ccc", ...)

创建后,如果调用 add() remove() set() 等方法,会报出异常。

 

注意事项

因为 Set 集合是一个成员唯一性的集合,集合中不允许存在相同的成员内容,因此,在创建不可变集合的过程中,如果出现相同成员,则会报异常错误。

// 有相同的成员,会报异常错误
Set<String> s = Set.of("aaa", "aaa", "ccc", ...)

 

 

Map 不可变集合

创建 Set 不可变集合

创建不可变集合不需要创建对象获得,可通过 Map 类静态方法创建获得

Map.of()

Map的不可变集合与 List 和 Set 略有不同,因为 Map 集合包含 Key 和 Value 键值对,因此Map也有12个方法,但没有可变参数的创建方式

Map.of(K k1, V v1)
Map.of(K k1, V v1, K k2, V v2)
Map.of(K k1, V v1, K k2, V v2, K k3, V v3)
Map.of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)
...
Map.of(K k1, V v1, K k2 V v2, K k3, V v3, ... , K k10, V v10)

同时包含一个,传入 Entry 数组的可变参数

Map.ofEntries(Entry<? extends K, ? extends V>... entries)

这里要注意:

ofEntries() 方法要求传入一个 Entry 类的数组,而 map.entrySet() 获取的是单个Entry 类的 Set 对象,因此我们要先把 map.entrySet() 的Set 集合转化为 Array,使用 toArray() 方法。

Object[] objects = entries.toArray();

但是如果直接 toArray() 的话,返回的是一个 Object 类型的数组,ofEntries() 方法不兼容这种类型,有以下三种办法

 

办法一:进行类型强制转换

Map.Entry[] entryArr = (Map.Entry[]) entries.toArray();
Map<String,String> maps = Map.ofEntries(entryArr);

 

办法二:创建一个对应类型的数组,使用 toArray(T[] a) 方法

// 通过创建一个对应类型的数组
Map.Entry[] entryArray = new Map.Entry[0];
Map.Entry[] entryArr = entries.toArray(entryArray);
Map<String,String> maps = Map.ofEntries(entryArr);

这里的办法,相当于是创建一个成员数为0的 Map.Entry 数组,传给 toArray() 方法,内部会把entries 的 Set 集合复制到 entryArray 中,并返回一个新的数组(因为数组创建后不可变,所以会创建新的数组并返回)。

当复制成员的过程中,如果entryArray的成员空间不足以存放当前的entries的Set集合成员时,会自动扩容。

 

办法三(JDK10后):使用 copyOf() 方法

Map<String,String> maps = Map.copyOf(map);

Java 了解到,如果我们使用 entries.toArray(new Map.Entry[0]);  这样的方法太不方便,所以在 JDK10 后,推出了 copyOf() 的方法来简化我们的工作,其底层方法,依然是来自于 办法二 中的操作。

 

注意事项

因为 Map 集合的 Key 是成员唯一性的集合,集合中不允许存在相同的成员内容,因此,在创建不可变集合的过程中,如果出现相同成员,则会报异常错误。

// 有相同的成员,会报异常错误
Map<String> s = Map.of("aaa", "111", "aaa", "222", "ccc", "333" ...)

如果您喜欢本站,点击这儿不花一分钱捐赠本站

这些信息可能会帮助到你: 下载帮助 | 报毒说明 | 进站必看

修改版本安卓软件,加群提示为修改者自留,非本站信息,注意鉴别

THE END
分享
二维码
打赏
海报
Java – 集合 – 不可变集合
集合在Java中有三种,分别是 List 集合 : 具有索引,顺序存储的集合 Set 集合 : 不具有索引,随机存储的集合 Map 集合 : 不具有索引,但有键值对应关系的集合。 其中,这三种我们都可以通过 set() remove() 等方法对集合数据进行增删改操作,这种集合我们称为可变集合。 而在集合中,也存在不可变集合,也就是不可以被修改的集合,创建出来后,只提供查询或遍历操作。
<<上一篇
下一篇>>