为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森林海 2021-08-25 19:15:08
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,
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

你的代码没有贴完整,不是很明白你要干什么,我推测注释那几行代码之前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



查看完整回答
反对 回复 2021-08-30
?
哔哔one

TA贡献1854条经验 获得超8个赞

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

查看完整回答
反对 回复 2021-08-30
  • 2 回答
  • 0 关注
  • 299 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信