复制集Java

有没有办法复制treeset ? 也就是说,有可能去

 Set <Item> itemList Set <Item> tempList tempList = itemList 

或者你是否需要物理地遍历这些集合并逐一复制它们?

另一种方法是使用复制构造函数 :

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

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

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

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

@Stephen C给出的复制构造函数是当你创build一个Set时(或者当你知道它来自何处时)的方法。 当它来自Map.entrySet() ,它将取决于您使用的Map实现:

findbugs说

entrySet()方法被允许返回一个单独的Entry对象在迭代期间被重用和返回的底层Map的视图。 从Java 1.6开始,IdentityHashMap和EnumMap都是这样做的。 在遍历这个Map时,Entry值只有在前进到下一次迭代时才有效。 例如,如果您尝试将这样的一个entrySet传递给一个addAll方法,事情就会变得非常糟糕。

由于addAll()被复制构造函数调用,所以您可能会发现只有一个Entry的Set:最后一个。

不是所有的Map实现都这样做,所以如果你知道你的实现在这方面是安全的,复制构造函数肯定是要走的路。 否则,你必须自己创build新的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上执行的testing(感谢Stephen C),findbugs评论似乎不再合适。 早期版本的Java 6(u45之前)可能会出现这种情况,但我没有任何testing。

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

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