Java:在Arraylist.set之后获取旧值

时间:2013-09-29 14:36:10

标签: java arraylist

    int count=0    
    Position a = sortedlist.get(count);
        if(...)
        {
            System.out.println(sortedlist);
            //change the arraylist index(count) here            
            sortedlist.set(count, new Position(a.start(),sortedlist.get(i).start(),a.height()));
            System.out.println(sortedlist);
            //print out position a, prospected changed value 
            System.out.println(a);
        }

catlog将显示

[<2.0, 5.0, 4.0>, <4.0, 7.0, 3.0>, <1.0, 3.0, 2.0>, <2.0, 4.0, 1.0>]
[<2.0, 4.0, 4.0>, <4.0, 7.0, 3.0>, <1.0, 3.0, 2.0>, <2.0, 4.0, 1.0>]
<2.0, 5.0, 4.0>

不知道为什么即使在index0的Arraylist元素发生变化之后,a仍将保持原始的index0值。

1 个答案:

答案 0 :(得分:4)

您的列表和a变量都引用(指向)对象,该对象位于内存中的其他位置。您的set调用会在列表中的该位置引用 new 对象,这对a指向的对象没有影响。

让我们抛出一些ASCII-Art:

set之前:

+------------+
| sortedlist |
+------------+             
| index 0    |------------>+-----------------+
+------------+    +------->|  Position #1    |
                  |        +-----------------+
                  |        | <2.0, 5.0, 4.0> |
                  |        +-----------------+
+-----------+     |
|     a     |-----+
+-----------+

set后:

+------------+
| sortedlist |
+------------+             +-----------------+
| index 0    |------------>|  Position #2    |
+------------+             +-----------------+
                           | <2.0, 4.0, 4.0> |
                           +-----------------+

+-----------+              +-----------------+
|     a     |------------->|  Position #1    |
+-----------+              +-----------------+
                           | <2.0, 5.0, 4.0> |
                           +-----------------+

如果您希望a和列表都有更新的位置,您有两种选择:

  1. 在更新列表的同时更新a,或

  2. 不要在列表中放置 new 对象;相反,改变现有对象的状态