复制集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,您可以使用stream
和collect
来复制项目:
Set<Item> newSet = oldSet.stream().collect(Collectors.toSet());