Collection集合里面保存的只是添加的对象的引用,而不是添加对象的实例.
如下面的代码:
- import java.util.ArrayList;
- class Data
- {
- int val;
- }
- class Test
- {
- 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.val);
- }
- }
- }
复制代码
打印之后其实都是同一个结果:102,就是最后一次给val字段赋值的结果
原因是因为Data是一个类,在主函数中,只实例化了一个data变量的对象,data变量的实例是一个引用类型,保存的堆内存中,这个实例的字段val也和对象的实例一起,也是保存在堆内存的,所以在第一个循环中,list每次添加的都是同一个对象的引用,而且由于data的val字段也是和data一起的.而且每次修改这个字段的值,都没有实例化新的对象,也就是说那个对象的引用一直没有改变,所以添加的只是同一个引用,到最后一次把val的值设为102,data还是原来的那个对象,添加的还是原来一样的引用,所以list添加了三次data,其实添加的是同一个对象的引用,并且这个对象在最后的循环中把val设为了102,所以在第二个循环打印的时候,其实打印的都是同样的引用指向的data对象的val字段的值.
给大家做一个复习:victory:
|
|