复制设置Java

时间:2011-09-24 06:04:25

标签: java copy set

有没有办法复制TreeSet?也就是说,是否可以去

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

tempList = itemList;

或者您是否需要逐个遍历集合并逐个复制它们?

5 个答案:

答案 0 :(得分:141)

另一种方法是使用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 Collection API的工作方式:它们不复制元素对象。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

@Stephen C给出的复制构造函数是您创建Set时(或者当您知道它来自何处时)的方法。 如果它来自Map.entrySet(),则取决于您使用的Map实施方式:

findbugs

  

允许entrySet()方法返回底层视图   在其中重用和返回单个Entry对象的映射   迭代。从Java 1.6开始,IdentityHashMap和EnumMap都这样做了。   迭代这样的Map时,Entry值仅在有效之前有效   你进入下一个迭代。例如,如果您尝试通过   这样一个addAll方法的entrySet,事情就会出错了。

当复制构造函数调用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));

编辑:与我在Java 7和Java 6u45上执行的测试(感谢Stephen C)不同,findbugs注释似乎不再合适。在早期版本的Java 6(在u45之前)可能就是这种情况,但我没有任何测试。

答案 3 :(得分:3)

Java 10 开始:

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

Set.copyOf()返回包含给定Set元素的不可修改的Collection

给定的Collection不能为null,并且不能包含任何null元素。

答案 4 :(得分:1)

Java 8 +

Set<String> copy = new HashSet<>(mySet);