以下程序的运行结果是:( )
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);
}
}
//true表示包含边界值(608和611),false表示不包含
subSet = (TreeSet)ts.subSet(608,true,611,true);
System.out.println(subSet); // 输出[608, 610]
//609在608和611之间,所以可以同时添加到set和subSet中
set.add(609);
System.out.println(set); // 输出[606, 608, 609,610, 612]
System.out.println(subSet); // 输出[608, 609 , 610]
//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]
//609在608和611之间,所以可以同时添加到ts和ts2中
subSet.add(609);
//输出 set=[606, 608, 610, 609, 612]
// subSet=[608, 609, 610]
//609不在608和611之间,所以通过ts2添加时会报错
subSet.add(609);
//报错:IllegalArgumentException: key out of range