问题描述
- 结果为什么是三个102?
-
package com.itcast;import java.util.ArrayList;
class Data {
int val;
}public class HomeWork01{
public static void main(String args[]) {
Data data = new Data();ArrayList<Data> list = new ArrayList<Data>();
for (int i = 100; i < 103; i++) {
data.val = i;list.add(data);
}
for (Data d : list) {
System.out.println(d);
}
}}
解决方案
是这样的,你在for前面创建了一个对象data,你的第一个for循环,会将data的val值设置为100,然后将其放到list中,list中的第一个元素的val值就为100
,然后你在执行第二个循环时,将data的val值设置为101,这时因为这个data对象已经放入了list中,所以list的第一个元素也会变化,你再将data放入list
中,list的第二个元素也为这个data,所以val为101,依次类推。。。。
解决方案二:
你这里只创建了一个Data对象,也就是说你的list里面的三个元素其实都是指向同一个Date对象,所以你在for循环中data.val=i的操作在改变了val的值,list
中的三个元素会同时改变,因为这三个元素实际上是引用的同一个对象。如果你想不改变的话,就要创建三个不同的Data对象,分别放入list中
解决方案三:
这样写
ArrayList<Data> list = new ArrayList<Data>();
for (int i = 100; i < 103; i++) {
Data data = new Data();
data.val = i;
list.add(data);
}
解决方案四:
上面的这几位博主的说法都很对,集合类创建对象,引用传递将改变还对象的值,你的代码中,在循环在创建了对象,所以在在循环中只有一个对象,这样的话集合类里的对象只有一个对象,是重复的相同的值,所以会出现3个102,所以在循环内创建对象就会解决问题
解决方案五:
i 100
i 101
add 的是什么呢?
解决方案六:
这里涉及到代码底层的相关知识,建议你去看看java的引用或者c语言指针的概念,不然这个地方确实对于你很难理解。