将值设置为sam对象时替换列表值

时间:2013-05-03 10:21:10

标签: java list

当我将值设置为另一个列表时,

列表值被替换。 请帮帮我。

public void testValue(){
        invInTc1 = new ArrayList<>();
        invInTc2 = new ArrayList<>();

        InvInTc invIn = new InvInTc();
        invIn.setInvInTcKey("1234");
        invIn.setInvInTcQty(1); // I set value in here
        invInTc1.add(invIn);

        InvInTc invIn2 = invInTc1.get(0);
        invIn2.setInvInTcQty(5); // and when I set value again, value invInTc1 is replaced to 5
        invInTc2.add(invIn);
    }

3 个答案:

答案 0 :(得分:3)

这里有一个对象 - InvInTc的一个实例。

两个数组列表中的值都引用同一个对象,因此通过两个列表都可以看到对该对象所做的更改。

作为一个现实世界的例子,假设我在两张纸上写下我的家庭住址,然后给Joe一张纸,给Fred一张。乔走了,把我的前门涂成红色......然后弗雷德来到我家。当然他会看到一个红色的前门。在您的代码中发生了完全相同的事情。

如果你想要两个独立的对象,你需要创建两个独立的对象:

InvInTc invIn = new InvInTc();
invIn.setInvInTcKey("1234");
invIn.setInvInTcQty(1);
invInTc1.add(invIn);

InvInTc invIn2 = new InvInTc();
// Copy the key from one object to the other
invIn2.setInvInTcKey(invIn.getInvTcKey());
// But set a different quantity
invIn2.setInvInTcQty(5);
invInTc2.add(invIn);

了解对象和引用在Java中的工作方式非常重要 。我强烈建议你掌握一本好书,详细解释它。

(我也鼓励你重新考虑你的名字,以便更友好。)

答案 1 :(得分:0)

使用invInTc1.get(0)获得的引用仍指向list1中添加的同一对象。因此,当您修改该值时,实际上是在修改相同的对象引用。

两个列表都可以看到对此对象所做的更改。

答案 2 :(得分:0)

正如Arun所说,你正在操纵同一个对象,这里是你的代码的剖析:

InvInTc invIn = new InvInTc(); //你在这里创建了一个实例

//设置不同的属性    invIn.setInvInTcKey( “1234”);    invIn.setInvInTcQty(1); //我在这里设置值

//将对象添加到Arraylist    invInTc1.add(invIn);

//您正在创建一个指向列表第0个元素的新引用    //因为你只添加了一个元素,即invIn,所以invIn2将指向与invIn相同的//内存位置    InvInTc invIn2 = invInTc1.get(0);

//所以你正在处理同一个对象,但是使用了你的新引用,因此值将被改变为与invIn保持相同的对象   invIn2.setInvInTcQty(5);

//添加到列表中的另一个元素,但这两个元素都引用了同一个对象。   invInTc2.add(invIn);

希望有所帮助