关于list.clear()问题,具体情况请看下面!

while((timeSequence+j)!=(traindatas.size())){
ArrayList<String> tempData = new ArrayList<>();
// if(tempData.size()>0){
// tempData.clear();
//
// }
for (int i = j; i < timeSequence+j+1; i++) {
tempData.add(String.valueOf(traindatas.get(i).get(preClass)));
}
j++;
System.out.println(tempData);
trainDatas.add(tempData);
}

注释掉的语句和上面那句的区别?为什么用注释的语句时trainDatas一直得到的是最后的tempData,

森林海
浏览 300回答 2
2回答

慕姐4208626

你的代码没有贴完整,不是很明白你要干什么,我推测注释那几行代码之前tempData这个集合是不是在外面定义的(也就是值while循环之前),如果是这样的话你每次执行trainDatas.add(tempData);添加的都是同一个对象,只是每次循环都把tempData的内容清除了重新添加,所以循环完了你trainDatas中的所有list里的内容肯定都是一致的,并且是最后一次循环所添加的内容。针对这个问题很好理解,在List等集合中添加元素时,其实都是添加的元素的引用,当元素里的内容改变了,集合中加入的元素也会受影响。例如一下一段代码,可能你期望输出是0~4,但你执行了发现输出了5个4:List<List<Integer>> list = new ArrayList<>();List<Integer> elements = new ArrayList<>();for (int i = 0; i < 5; i++) {if (!elements.isEmpty()) {elements.clear();}elements.add(i);list.add(elements);}for (List<Integer> ele : list) {for (Integer i : ele) {System.out.print(i + "\t");}}// 输出 4 4 4 4 4这和你上面的问题很类似,只需要把List<Integer> elements = new ArrayList<>();放入for循环里面,每次循环都新创建一个新的elements,问题就迎刃而解了。List<List<Integer>> list = new ArrayList<>();for (int i = 0; i < 5; i++) {List<Integer> elements = new ArrayList<>();if (!elements.isEmpty()) {elements.clear();}elements.add(i);list.add(elements);}for (List<Integer> ele : list) {for (Integer i : ele) {System.out.print(i + "\t");}}// 输出 0 1 2 3 4

哔哔one

用ArrayList<String> tempData = new ArrayList<>();的时候,每一次while循环都是创建了一个新的arraylit对象,他跟其它的对象并没有任何关联,所以每次添加到traindatas时结果都是不一样的,但是你注释掉的语句始终都是同一个对象,只是做了clear,这会导致你traindatas中加入的tempdata,实际上都是同一个东西
打开App,查看更多内容
随时随地看视频慕课网APP