4

在下面的代码中,我们创建了两个不同的 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]

4

1 回答 1

7

答案在文档中:

返回的集合由该集合支持,因此返回集合中的更改会反映在该集合中,反之亦然。返回的集合支持该集合支持的所有可选集合操作。

当然,如果您不希望返回集合中的更改反映在原始集合中,只需复制子集:

subs = new TreeSet<>(s.subSet(608, true, 611, true));

请注意,您的原始代码具有未经检查的强制转换操作。您不应该转换为TreeSet, 但是TreeSet<Integer>

subs = (TreeSet<Integer>)s.subSet(608, true, 611, true);
于 2013-10-14T07:03:23.813 回答