0

当我将值设置为另一个列表时,列表值被替换。请帮我 。

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);
    }
4

3 回答 3

3

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

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

作为一个真实的例子,假设我在两张纸上写下我的家庭住址,一张纸给乔,一张给弗雷德。乔去把我的前门漆成红色……然后弗雷德来我家。他当然会看到一扇红色的前门。您的代码中正在发生完全相同的事情。

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

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 中的工作方式至关重要。我强烈建议你找一本详细解释它的好书。

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

于 2013-05-03T10:26:09.610 回答
0

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

对此对象所做的更改将对两个列表都可见。

于 2013-05-03T10:26:42.660 回答
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);

希望能帮助到你

于 2013-05-03T10:31:12.040 回答