web-dev-qa-db-ja.com

ArrayListとそれに含まれるオブジェクトの変更

ArrayList myArrayがあるとします。関数を呼び出してオブジェクトを変更したい。このようにすると、元のオブジェクトは変更されますか?

myArray.get(0).myModyfyingFunction();

さらに明確にするために-get()が実際に元のオブジェクトへの参照を返すのか、元のオブジェクトのコピーのみを返すのか心配です。

23
Primož Kralj

get()は、オブジェクトへの参照を返しますが、コピーは返しません。返された参照に対して行う変更は、オブジェクト自体に対して行われます

61
Óscar López

ArrayListにオブジェクトを保存すると、オブジェクトは複製されず、オブジェクトの変更はオブジェクト自体に反映されます。

たとえば、クラス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を出力します。

7
kundan bora

これは、ArrayListに保存したオブジェクトの種類によって異なります。たとえば、Java.lang.String s、呼び出しは何も変更しません。そうでなければ、はい、インデックス0に保存されているオブジェクトを変更します。

2
ring bearer

Javaはオブジェクトのコピーを返さず、オブジェクトの参照へのコピーのみを返します。したがって、メソッドはインデックス0のオブジェクトを確実に変更します。

メソッドがオブジェクトを作成する場合、オブジェクトの「コピー」を取得できます。可能であればreturn object.clone();を使用しますが、実際にが返されるのは、メソッドでまだ作成されたコピーへの参照です。したがって、より広い意味でオブジェクトの「コピー」を取得することはできますが、ArrayList#get(...)はそれを行いません。明示的に指定されていない限り、どちらのゲッターもこれを行いません。

1
Thomas

オブジェクトへの参照を提供するため、関数がその状態で何らかの変更を実行すると、オブジェクトが変更されます。

これを行うと同じことが起こります:

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
1

以下に例を示します。リスト内の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;
    }
}
0
Steer360

リスト内のオブジェクトを更新します。

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

更新されたオブジェクトを表示

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