在下面的代码中,我们创建两个不同的TreeSet对象。
我们为第一对象分配一些值,然后将第一对象的子集分配给第二对象。然后,我们仅将元素(609)添加到第一个对象 。那么为什么这个新元素同时出现在两个对象的中?
import java.util.*;
public class Explorer1 {
public static void main(String[] args) {
TreeSet<Integer> s = new TreeSet<Integer>();
TreeSet<Integer> subs = new TreeSet<Integer>();
for(int i = 606; i < 613; i++)
if(i%2 == 0) s.add(i);
subs = (TreeSet)s.subSet(608, true, 611, true);
s.add(609);
System.out.println(s + " " + subs);
}
}
输出:[606、608、609、610、612] [608、609、610]
最佳答案
答案在documentation中:
返回的集合受此集合的支持,因此返回的集合中的更改将反映在此集合中,反之亦然。返回的集合支持该集合支持的所有可选集合操作。
当然,如果您不希望返回集中的更改反映在原始集中,则只需复制一个子集即可:
subs = new TreeSet<>(s.subSet(608, true, 611, true));
请注意,您的原始代码具有未经检查的强制转换操作。您不应该强制转换为
TreeSet
,而是TreeSet<Integer>
:subs = (TreeSet<Integer>)s.subSet(608, true, 611, true);