首页 > 试题广场 >

public class ListParamTest&...

[单选题]
public class ListParamTest {
public static void resetList(List<Integer> dataList) {
dataList.subList(2,4).set(0,40);
dataList = new ArrayList<Integer>(dataList);
dataList.add(50);
}
public static void setOne(List<Integer> dataList) {
dataList.set(3,100);
}
public static void main(String[] args){
List<Integer> dataList = new ArrayList<Integer>(Arrays.asList(10,20,30,null));
resetList(dataList);
setOne(dataList);
int sum = 0;
for(Integer v:dataList){
sum +=v;
}
System.out.println(sum);
}
  • 160
  • 170
  • 抛出NullPointerException异常
  • 抛出ArrayIndexOutOfBoundsException异常
关键是这条代码的理解 dataList.subList(2,4).set(0,40);
上网找资料也没有找到这样子用的例子
subList一看就是找dataList中的下标2到4的部分 但这个下标的部分包括2,不包括4,所以应该是下标2和3的位置
获得了这么一个部分后 下一个是set(0,40) 一开始以为是把下标2和3的位置分别设置为0,40 但算出来最终答案是错的
后来找了一个set的意思 又思考了一下 set的声明是
set(int index, E element)
//index -- 替换索引的元素下标
//element -- 要被存储在指定位置的元素(即内容)
然后我觉得它想表达的意思是 找出下标为2和3之后 下标2在这一【子部分】中就成为了“下标0” 因此是把“下标0”中的30改成40
所以该行代码执行后dataList的元素内容为 10,20,40,null

由于dataList的声明为List<Integer> dataList = new ArrayList<Integer>(Arrays.asList(10,20,30,null));
而asList得到的数组是的没有add和remove方法的,因此在resetList方法中重新声明了dataList = new ArrayList<Integer>(dataList);
所以dataList才可以执行add的语句:dataList.add(50);

但是重新声明时候是new了一个新的对象,因此这里的add对原来的dataList所指向的对象是不会做任何改变的,而前面的set却不同,是对原来dataList所指向对象的修改,所以resetList方法执行完后原来dataList现在的数据情况为:10,20,40,null

再经过setOne方法后,dataList数据情况为:10,20,40,100
因此最后sum结果为170
编辑于 2019-03-04 15:03:32 回复(0)
关键点,在于 dataList.subList(2,4) 返回的对象 java.util.ArrayList.SubList 的了解,查看 JDK 源码可知 java.util.ArrayList.SubList#set
方法本质上,修改的还是原有集合的元素,集合的变化过程如下:  

Arrays.asList(10, 20, 30, null)   -->    10, 20, 30, null 
dataList.subList(2,4).set(0,40);  -->    10, 20, 40, null
dataList.add(50);                 -->    10, 20, 40, 50
dataList.set(3,100);              -->    10, 20, 40, 100
发表于 2020-11-08 18:47:30 回复(0)