在list之后添加一些对象并将对象设置为null

时间:2017-09-01 08:09:58

标签: java

class TestEntity {
    public int x;
    public int y;

    public TestEntity(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public String toString() {
        return super.toString() + ", x -> " + x + ", y -> " + y;
    }
}

TestEntity t = new TestEntity(666, 777);
List<TestEntity> list = new ArrayList<>();
list.add(t);
t = null;
System.out.println(list.get(0));

为什么使用

正确打印list.get(0)
  

@ xxxxx,x - &gt; 666,y - &gt; 777

如果我删除t = null;并执行t.x = 888,则打印效果正确。

2 个答案:

答案 0 :(得分:0)

当您在t中添加list时,tlist的第一个元素会引用相同的对象。

但是当您撰写t = null时,它会将null分配给t变量。
因此,现在tlist的第一个元素不再引用同一个对象。
因此,打印第一个或第二个将产生明显的结果。

在您撰写t.x = 888时,tlist的第一个元素仍然指向同一个对象。
您只更改对象字段的值 因此,打印第一个或第二个给出完全相同的结果。

答案 1 :(得分:0)

您没有将对象设置为null。您要将对象的引用设置为null。

t是对象的引用。致电list.add(t)时,您会在列表中存储此引用的副本(我们称之为t2)。所以你最终得到了

t -----> theObject
           ^
           |           
ArrayList [t2]

两个引用都指向同一个对象。

现在,当您执行t = null时,您只需更改t指向的内容即可。存储在列表中的副本并不关心这一点。现在只有t指向根本没有对象(null)。所以你最终得到了

t--> nothing    theObject
                   ^
                   |           
        ArrayList [t2]

因此,打印列表的第一个元素仍然会打印t2引用的对象,这是列表内部数组中的第一个引用。