Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制集Java_Java_Copy_Set - Fatal编程技术网

复制集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)应该更有效。