题目
以下程序的运行结果是:( )
TreeSet<Integer> set = new TreeSet<Integer>();
TreeSet<Integer> subSet = new TreeSet<Integer>();
for(int i=606;i<613;i++){
if(i%2==0){
set.add(i);
}
}
subSet = (TreeSet)set.subSet(608,true,611,true);
set.add(609);
System.out.println(set+" "+subSet);
A. 编译失败
B. 发生运行时异常
C. [606, 608, 609,610, 612] [608, 609,610]
D. [606, 608, 609,610, 612] [608,610]
答案是:C
题目来源:牛客网
链接:https://www.nowcoder.com/questionTerminal/9643a55b528743f6a68ac7adf9072ea0
题目分析
-
subSet(左边界,左边界是否取值,右边界,右边界是否取值)
-
subset(form,true,to,true)是Treeset的非静态方法,subSet是指向原数据的,原数据修改,subSet也跟着修改
private transient NavigableMap<E,Object> m; TreeSet(NavigableMap<E,Object> m) { this.m = m; } public NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { return new TreeSet(m.subMap(fromElement, fromInclusive, toElement, toInclusive)); }
subSet()返回集合中元素范围从fromElement到toElement的部分的视图。如果fromElement和toElement相等,则返回的集合为空,除非fromInclusive和toInclusive都为真。返回的集合与原集合相映射,因此返回集合中的更改将反映在该集合中,反之亦然。返回的集合支持该集合支持的所有原集合的操作。
举个例子:
TreeSet set = new TreeSet();
TreeSet subSet = new TreeSet();
for(int i=606;i<613;i++){
if(i%2==0){
ts.add(i);
}
}
- 情况1:
//true表示包含边界值(608和611),false表示不包含 subSet = (TreeSet)ts.subSet(608,true,611,true); System.out.println(subSet); // 输出[608, 610]
- 情况2:set添加
//609在608和611之间,所以可以同时添加到set和subSet中 set.add(609); System.out.println(set); // 输出[606, 608, 609,610, 612] System.out.println(subSet); // 输出[608, 609 , 610]
- 情况3:set添加
//629不在608和611之间,所以不能添加到subSet中,但可以添加到set中 set.add(629); System.out.println(set); //输出 set=[606, 608, 610, 612,629] System.out.println(subSet); // sebSet=[608, 610]
- 情况4:subSet添加
//609在608和611之间,所以可以同时添加到ts和ts2中 subSet.add(609); //输出 set=[606, 608, 610, 609, 612] // subSet=[608, 609, 610]
- 情况5:subSet添加
//609不在608和611之间,所以通过ts2添加时会报错 subSet.add(609); //报错:IllegalArgumentException: key out of range