JDK10 給 java.util 包下的List谅河、Set英遭、Map新增加了一個(gè)靜態(tài)方法 copyOf 。copyof方法將元素放到一個(gè)不可修改的集合并返回痕支。
代碼
import java.util.*;
public class Demo02 {
public static void main(String[] args) {
var list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
var list2 = List.copyOf(list);
System.out.println(list2);
System.out.println(list2.getClass());
list2.add("ee");
}
}
運(yùn)行出錯(cuò)
[圖片上傳失敗...(image-f9fb65-1639379187527)]
不能往copyof返回的集合中添加元素品擎,因?yàn)榉祷氐氖遣豢勺兊募希篶lass java.util.ImmutableCollectionsListN源碼:
static final class ListN<E> extends AbstractImmutableList<E> implements Serializable {
...
}
可以看到 ListN 繼承了 AbstractImmutableList 。再看 AbstractImmutableList 的源碼:
static abstract class AbstractImmutableList<E> extends AbstractImmutableCollection<E>
implements List<E>, RandomAccess {
// all mutating methods throw UnsupportedOperationException
@Override public void add(int index, E element) { throw uoe(); }
@Override public boolean addAll(int index, Collection<? extends E> c) { throw uoe(); }
@Override public E remove(int index) { throw uoe(); }
@Override public void replaceAll(UnaryOperator<E> operator) { throw uoe(); }
@Override public E set(int index, E element) { throw uoe(); }
@Override public void sort(Comparator<? super E> c) { throw uoe(); }
}
可以看到在 AbstractImmutableList 中所有對(duì)元素增刪改的方法都會(huì)拋出異常揍异。由此可見(jiàn)copyof返回的是不可變集 合全陨。
List,Set衷掷,Map的copyof方法代碼:
import java.util.*;
public class Demo02 {
public static void main(String[] args) {
var list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
var list2 = List.copyOf(list);
System.out.println(list2);
System.out.println(list2.getClass());
list2.add("ee");
System.out.println("---------------");
var set = new HashSet<String>();
set.add("b");
set.add("a");
set.add("c");
set.add("d");
var set2 = Set.copyOf(set);
System.out.println(set2.getClass());
for (String string : set2) {
System.out.println(string);
}
System.out.println("---------------");
var map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
var map2 = Map.copyOf(map);
System.out.println(map2.getClass());
var keys = map2.keySet();
for (Object object : keys) {
System.out.println(map2.get(object));
}
}
}
小結(jié)
List,Set,Map新增的copyOf方法辱姨,返回的是一個(gè)新的集合,這個(gè)新的集合是不可變的集合棍鳖,不能改變集合中的內(nèi)容