ArrayList和修改其中包含的对象

时间:2012-03-19 17:13:02

标签: java arraylist pass-by-reference

假设我们有一个ArrayList myArray。我想通过调用它的函数来修改一个对象。如果我这样做,原始对象是否会被更改?

myArray.get(0).myModyfyingFunction();

进一步澄清 - 我担心get()实际上是否返回对原始对象的引用,或者只返回原始对象的副本。

7 个答案:

答案 0 :(得分:59)

get()将返回对象的引用,而不是副本。您对返回的引用所做的任何修改都将在对象本身上进行

答案 1 :(得分:7)

如果在ArrayList中存储任何对象,则不会复制Object,并且对象中的任何更改都应反映在对象本身中。

例如我们有类NewClass

  public class NewClass {

private String mystring="";

/**
 * @return the mystring
 */
public String getMystring() {
    return mystring;
}

/**
 * @param mystring the mystring to set
 */
public void setMystring(String mystring) {
    this.mystring = mystring;
}

}

这里是任何其他类的主要方法中的代码

   List<NewClass> newclasses = new ArrayList<NewClass>();
    NewClass class1 = new NewClass();
    class1.setMystring("before1");
    NewClass class2 = new NewClass();
    class2.setMystring("before2");
    newclasses.add(class1);
newclasses.add(class2);
newclasses.get(0).setMystring("after1");
System.out.println(class1.getMystring());

这将输出after1。

答案 2 :(得分:2)

这取决于您在ArrayList中存储的对象类型。 例如,如果它们是java.lang.String s,则调用不会修改任何内容。 否则,是的,它将修改存储在索引0的对象。

答案 3 :(得分:1)

Java永远不会返回对象的副本,只会复制到对象的引用。因此,该方法肯定会改变索引0处的对象。

如果方法会创建一个对象,则可以获得对象的“副本”,例如如果可能的话,使用return object.clone();,但实际返回的内容是对仍在方法中创建的副本的引用。所以你可以在更广泛的意义上得到一个对象的“副本”,但是ArrayList#get(...)不会这样做 - 按照惯例,除非明确说明,否则getter都不应该这样做。

答案 4 :(得分:1)

它为您提供对象的引用,因此如果您的函数在其状态中执行任何修改,您的对象将被修改。

执行此操作时也会发生相同的情况:

ArrayList myArray = new ArrayList();
MyObject obj = new MyObject();
myArray.add(obj);
obj.myModifyingFunction();
myArray.get(0).equals(obj); // returns true
myArray.get(0) == obj; // returns true as well

答案 5 :(得分:0)

这是一个例子。修改List中的Test类对象。

public class ModifyArrayList {

    public static void main (String [] args) {

        List<Test> tests = new ArrayList<Test>();

        Test firstTest = new Test();
        firstTest.setId(100);
        firstTest.setName("John");
        tests.add(firstTest);

        Test secondTest = new Test();
        secondTest.setId(101);
        secondTest.setName("Tracy");
        tests.add(secondTest);

        Test thirdTest = new Test();
        thirdTest.setId(102);
        thirdTest.setName("Ryan");
        tests.add(thirdTest);

        ListIterator<Test> testIterator = tests.listIterator();
        while(testIterator.hasNext()) {

            Test test = testIterator.next();
            if (test.getName().equals("Ryan")) {
                test.setId(300);
            }

            testIterator.remove();
            testIterator.add(test);
        }

        for (Test test : tests) {
            System.out.println("Test #" + test.getId() + " name=" + test.getName());
        }

    }
}

Test.java

class Test {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

答案 6 :(得分:0)

更新列表中的对象:

for (User user: Users) {
    user.setName( user.getName() + " New Name");
}

显示更新的对象

for (User user: Users) {    
    System.out.println( user.getName());
}