JDK10 给 java.util 包下的List、Set、Map新增加了一个静态方法 copyOf 。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");
}
}
运行出错
[图片上传失败...(image-f9fb65-1639379187527)]
不能往copyof返回的集合中添加元素,因为返回的是不可变的集合:class 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 中所有对元素增删改的方法都会抛出异常。由此可见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));
}
}
}
小结
List,Set,Map新增的copyOf方法,返回的是一个新的集合,这个新的集合是不可变的集合,不能改变集合中的内容