有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

复制集Java

有没有办法复制TreeSet?就是可以去吗?

Set <Item> itemList;
Set <Item> tempList;

tempList = itemList;

或者你必须在集合中进行物理迭代并一个接一个地复制它们吗


共 (5) 个答案

  1. # 1 楼答案

    另一种方法是使用copy constructor

    Collection<E> oldSet = ...
    TreeSet<E> newSet = new TreeSet<E>(oldSet);
    

    或者创建一个空集并添加元素:

    Collection<E> oldSet = ...
    TreeSet<E> newSet = new TreeSet<E>();
    newSet.addAll(oldSet);
    

    clone不同,这些允许您使用不同的集合类、不同的比较器,甚至可以从其他(非集合)集合类型填充


    请注意,复制Set的结果是一个新的Set,其中包含对作为元素的对象的引用(如果原始Set)。图元对象本身不会被复制或克隆。这符合Java CollectionAPI的工作方式:它们不复制元素对象

  2. # 2 楼答案

    当您创建了一个Set时(或者当您知道它来自何处时),由@Stephen C给出的复制构造函数就是一种方法。 当它来自^{}时,它将取决于您正在使用的Map实现:

    findbugs

    The entrySet() method is allowed to return a view of the underlying Map in which a single Entry object is reused and returned during the iteration. As of Java 1.6, both IdentityHashMap and EnumMap did so. When iterating through such a Map, the Entry value is only valid until you advance to the next iteration. If, for example, you try to pass such an entrySet to an addAll method, things will go badly wrong.

    由于复制构造函数调用了addAll(),您可能会发现自己只拥有一个条目集:最后一个条目

    但并非所有的Map实现都会这样做,因此,如果您知道您的实现在这方面是安全的,那么复制构造函数肯定是一种选择。否则,您必须自己创建新的Entry对象:

    Set<K,V> copy = new HashSet<K,V>(map.size());
    for (Entry<K,V> e : map.entrySet())
        copy.add(new java.util.AbstractMap.SimpleEntry<K,V>(e));
    

    编辑:与我在Java7和Java6U45上执行的测试不同(多亏了StephenC),findbugs注释似乎不再合适了。在早期版本的Java6(u45之前)上可能是这样,但我没有任何测试

  3. # 3 楼答案

    Java 8+

    Set<String> copy = new HashSet<>(mySet); 
    
  4. # 4 楼答案

    使用Java 8,您可以使用streamcollect复制项目:

    Set<Item> newSet = oldSet.stream().collect(Collectors.toSet());
    

    或者您可以收集到ImmutableSet(如果您知道集合不应更改):

    Set<Item> newSet = oldSet.stream().collect(ImmutableSet.toImmutableSet());
    
  5. # 5 楼答案

    从Java 10开始:

    Set<E> oldSet = Set.of();
    Set<E> newSet = Set.copyOf(oldSet);
    

    ^{}返回一个不可修改的Set,其中包含给定Collection的元素

    给定的Collection不能是null,也不能包含任何null元素