列表值被替换。 请帮帮我。
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);
}
答案 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);
希望有所帮助