java10 新特性 集合新增的copyof方法

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 查看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方法,返回的是一个新的集合,这个新的集合是不可变的集合,不能改变集合中的内容

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容