复制集Java
有没有办法复制复制集Java,java,copy,set,Java,Copy,Set,有没有办法复制树集?就是可以去吗? Set <Item> itemList; Set <Item> tempList; tempList = itemList; 设置项目列表; 圣殿骑士; templast=itemList; 或者,您必须通过物理方式遍历集合并逐个复制它们吗?另一种方法是使用: Collection oldSet=。。。 树集新闻集=新树集(旧集); 或者创建一个空集并添加元素: Collection<E> oldSet = ...
树集
?就是可以去吗?
Set <Item> itemList;
Set <Item> tempList;
tempList = itemList;
设置项目列表;
圣殿骑士;
templast=itemList;
或者,您必须通过物理方式遍历集合并逐个复制它们吗?另一种方法是使用:
Collection oldSet=。。。
树集新闻集=新树集(旧集);
或者创建一个空集并添加元素:
Collection<E> oldSet = ...
TreeSet<E> newSet = new TreeSet<E>();
newSet.addAll(oldSet);
Collection oldSet=。。。
TreeSet newSet=新树集();
newSet.addAll(旧集);
与克隆不同,克隆允许您使用不同的集合类、不同的比较器,甚至可以从其他(非集合)集合类型填充
请注意,复制
集
的结果是一个新的集
,其中包含对作为元素的对象的引用(如果原始集
)。图元对象本身不会被复制或克隆。这与Java集合
API的工作方式一致:它们不复制元素对象。当您创建了一个集合
时(或者当您知道它来自何处时),由@Stephen C给出的复制构造函数就是一种方法。
当它来自时,它将取决于您正在使用的Map
实现:
说
允许entrySet()方法返回底层对象的视图
在映射过程中重用并返回单个条目对象的映射
迭代。从Java1.6开始,IdentityHashMap和EnumMap都这样做了。
在遍历此类映射时,条目值仅在
您可以前进到下一个迭代。例如,如果您试图通过
如果将这样的入口设置为addAll方法,则会出现严重错误
由于复制构造函数调用了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));
Set copy=newhashset(map.size());
对于(条目e:map.entrySet())
add(newjava.util.AbstractMap.SimpleEntry(e));
编辑:与我在Java7和Java6U45上执行的测试不同(多亏了StephenC),findbugs注释似乎不再合适了。在早期版本的Java 6(u45之前)上可能是这样,但我没有任何测试。对于Java 8,您可以使用
流
和收集
来复制项目:
Set<Item> newSet = oldSet.stream().collect(Collectors.toSet());
从Java 10开始:
Set<E> oldSet = Set.of();
Set<E> newSet = Set.copyOf(oldSet);
Set<String> copy = new HashSet<>(mySet);
Set oldSet=Set.of();
Set newSet=Set.copyOf(oldSet);
返回一个不可修改的集合
,该集合包含给定集合的元素
给定的
集合
不得为null
,且不得包含任何null
元素。Java 8+:
Set<E> oldSet = Set.of();
Set<E> newSet = Set.copyOf(oldSet);
Set<String> copy = new HashSet<>(mySet);
Set copy=newhashset(mySet);
templast.addAll(itemList)
这是基于观察的吗?如果是这样,那听起来像是addAll
实现中的一个bug。FWIW,我看过的Map
实现都迭代了条目集(在某个级别),并为每个条目提取键和值。条目集迭代器每次都可能返回相同的对象这一事实并不重要。我看到的唯一不同的情况是EnumMap
,其中复制构造函数本身正在克隆条目。。。如果源映射是EnumMap
@StephenC,那么您似乎是对的:我使用IdentityHashMap
所做的测试不会导致该错误。更麻烦的是,我在Java6U45上测试了它,也没有问题。我猜这是findbugs(或他们基于规则的JDK)中的一个bug。我会编辑我的答案。你可以。。。但是,如果只是复制一个集合,那么复制构造函数(etc)应该更有效。