一.应用场景
二.创建不可变集合的书写格式(List,Set,Map)
List集合
java
复制代码
package com.njau.d9_immutable;
import java.util.Iterator;
import java.util.List;
/**
* 创建不可变集合:List.of()方法
* "张三","李四","王五","赵六"
* 创建不可变集合的书写形式
* 在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。
* 方法名称
* static<E> List<E> of(E...elements) 创建一个具有指定元素的List集合对象
* static<E> set<E> of(E...elements) 创建一个具有指定元素的Set集合对象
* static<K,V> Map<K,V> of(E...elements) 创建一个具有指定元素的Map集合对象
* 注意:这个集合不能添加,不能删除,不能修改
*/
public class ImmutableDemo1 {
public static void main(String[] args) {
List<String> list = List.of("张三","李四","王五","赵六");
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));
System.out.println("-----------------------------------");
for (String s : list) {
System.out.println(s);
}
System.out.println("-----------------------------------");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String next = it.next();
System.out.println(next);
}
System.out.println("-----------------------------------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
/*
都会报错
list.add("aaa");
list.remove("张三");
list.set(0,"洪七");
*/
}
}
Set集合
java
复制代码
package com.njau.d9_immutable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class ImmutableDemo2 {
public static void main(String[] args) {
// 创建不可变的Set集合
// 细节:当我们要获取一个不可变的set集合的时候,要满足set集合的要求,即集合中的元素不能重复
// "张三","李四","王五","赵六"
Set<String> set = Set.of("张三","李四","王五","赵六");
for (String s : set) {
System.out.println(s);
}
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String next = it.next();
System.out.println(next);
}
/*
set.add("萌二");
set.remove("王五");*/
}
}
Map集合
java
复制代码
package com.njau.d9_immutable;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ImmutableDemo3 {
public static void main(String[] args) {
/*
* 创建不可变的Map集合
* 细节1:Map集合中的元素是不可重复的
* 细节2:Map里面的of方法,参数是有上限的,最多只能传递20个参数,10个键值对
* 细节3:如果想要定义大于20个参数的不可变map对象,那么必须使用entries。即将key和value看作一个整体,再使用可变参数
*/
Map<String, String> map = Map.of("张三", "南京", "李四", "北京", "王五", "上海", "赵六",
"广州", "孙七", "深圳", "周八", "杭州", "武九", "宁波", "郑十", "苏州",
"刘一", "无锡", "陈二", "嘉兴");
Set<String> set = map.keySet();
for (String key : set) {
String value = map.get(key);
System.out.println(key + "=" + value);
}
System.out.println("------------------------------------------------");
Set<Map.Entry<String, String>> entries = map.entrySet(); // 将map对象转变为entry对象
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
// 可变参数只能有一个,且放在参数的最后,因此无法设计
/*
public static<K,V> void of(K...keys,V...values) {
}
*/
}
当使用Map集合时,其中的<K,V>参数最多只能有10对。参见下面的Map.of源码:
java
复制代码
static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);
}
那么,当我们想要使用不可变的Map集合存储超过10个键值对元素的时候,该怎么办呢?请看三。
三.任意容量大小的不可变Map集合的建立
方法一:将<K,V>看作一个整体使用entrySet方法,将其作为一个整体存储在Set集合中,然后再使用toArray(T[])方法将Set集合转换为一个Map.Entry类型的数组(因为可变参数的本质是一个数组,而想要传递无限量的参数就必须使用可变参数,因此要将其转为数组)。而ofEntries(Entry<? extends K, ? extends V>... entries)方法就是用来接受一个可变参数(数组),存储在不可变的Map集合中。
java
复制代码
package com.njau.d9_immutable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 使用entry类型实现不可变的map集合构建
*/
public class ImmutableDemo4 {
public static void main(String[] args) {
Map<String,String> hm = new HashMap<>();
hm.put("张三", "南京");
hm.put("李四", "北京");
hm.put("王五", "上海");
hm.put("赵六", "广州");
hm.put("孙七", "深圳");
hm.put("周八", "杭州");
hm.put("武九", "宁波");
hm.put("郑十", "苏州");
hm.put("刘一", "无锡");
hm.put("陈二", "嘉兴");
hm.put("aaa","aaa");
Set<Map.Entry<String, String>> entries = hm.entrySet();
// 该数组大小没关系,因为大了会将多余空间置为null,小了会进行自动扩容
Map.Entry[] arr2 = new Map.Entry[0];
// 调用toArray(数组参数类型)方法将entries对象转换为Entries数组(可变参数)
Map.Entry[] arr1 = entries.toArray(arr2);
// 将Entries数组传入Map.ofEntries方法,生成一个不可变的Map集合
Map map = Map.ofEntries(arr1);
map.put("bbb","222");
}
}
java
复制代码
package com.njau.d9_immutable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 使用entry类型实现不可变的map集合构建
*/
public class ImmutableDemo4 {
public static void main(String[] args) {
Map<String,String> hm = new HashMap<>();
hm.put("张三", "南京");
hm.put("李四", "北京");
hm.put("王五", "上海");
hm.put("赵六", "广州");
hm.put("孙七", "深圳");
hm.put("周八", "杭州");
hm.put("武九", "宁波");
hm.put("郑十", "苏州");
hm.put("刘一", "无锡");
hm.put("陈二", "嘉兴");
hm.put("aaa","aaa");
// 链式编程
Map<String, String> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
map.put("bbb","333");
}
}
方法二:使用Map.copyOf直接生成一个不可变的Map集合(底层代码和上面原理一模一样)
java
复制代码
package com.njau.d9_immutable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 使用entry类型实现不可变的map集合构建
*/
public class ImmutableDemo4 {
public static void main(String[] args) {
Map<String,String> hm = new HashMap<>();
hm.put("张三", "南京");
hm.put("李四", "北京");
hm.put("王五", "上海");
hm.put("赵六", "广州");
hm.put("孙七", "深圳");
hm.put("周八", "杭州");
hm.put("武九", "宁波");
hm.put("郑十", "苏州");
hm.put("刘一", "无锡");
hm.put("陈二", "嘉兴");
hm.put("aaa","aaa");
Map<String, String> map1 = Map.copyOf(hm);
map1.put("ttt","777");
}
}