当我尝试将对象添加到列表时,以下代码有什么问题?

时间:2018-10-01 06:59:41

标签: java

请参考下面的代码,让我知道我要去哪里了

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'com.google.gms:google-services:4.0.1'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
        google()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

我要在

上添加元素
public class EmployeeTest {

    public static void main(String[] args) {

        ArrayList<Employee> list = new ArrayList<>();

        list.add(new Employee("1026751","Jack Reacher"));
        list.add(new Employee("1026722","Tom Cruise"));

        System.out.println(list);
        //Employee a = list.get(0);
        Employee e = list.get(0);
        Employee p = list.get(1);
        list.clear();
        e.setEmployeeName("Rishabh Bansal");
        list.add(e);
        e.setEmployeeName("Jack Reacher");
        list.add(e);
        list.add(p);
        System.out.println(list);


    }

}

但是我得到的列表不是-:

 0 index as "1026751","Rishabh Bansal" 
 1 index as "1026751","Jack Reacher"
 2 index as "1026722","Tom Cruise"

为什么索引0上的元素被更改...

2 个答案:

答案 0 :(得分:4)

您两次将相同的引用添加到Employee

e.setEmployeeName("Rishabh Bansal");
list.add(e);
e.setEmployeeName("Jack Reacher");
list.add(e);

但是这两个引用仍然引用您正在更改的 same 对象。

所以您也应该在这里创建新对象。

答案 1 :(得分:1)

这是前两个add()之后您的列表的样子:

[oid1, oid2]

oid1和oid2是状态保留在其他位置的对象的“指针”(引用):

oid1 := Employee("1026751","Jack Reacher")
oid2 := Employee("1026722","Tom Cruise")

在两个.get()之后,在这些对象上有两个“句柄”:

e == oid1
p == oid2

然后清除列表,使列表变为:

[]

然后,您更改两个对象之一的状态,并将其添加到列表中,以使您拥有:

[oid1]
oid1 := Employee("1026751","Rishabh Bansal")
oid2 := Employee("1026722","Tom Cruise")

然后,您更改同一对象的状态,然后将其再次添加到列表中,以使您拥有:

[oid1, oid1]
oid1 := Employee("1026751","Jack Reacher")
oid2 := Employee("1026722","Tom Cruise")

所以索引0上的对象只是因为您要而被更改。如果只有一个对象,则只有一个状态。想要列表上的三个状态?需要三个对象。