有没有办法复制TreeSet
?也就是说,是否可以去
Set <Item> itemList;
Set <Item> tempList;
tempList = itemList;
或者您是否需要逐个遍历集合并逐个复制它们?
答案 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,您可以使用stream
和collect
复制项目:
Set<Item> newSet = oldSet.stream().collect(Collectors.toSet());
答案 2 :(得分:3)
@Stephen C给出的复制构造函数是您创建Set
时(或者当您知道它来自何处时)的方法。
如果它来自Map.entrySet()
,则取决于您使用的Map
实施方式:
允许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);