ArrayList myArrayがあるとします。関数を呼び出してオブジェクトを変更したい。このようにすると、元のオブジェクトは変更されますか?
myArray.get(0).myModyfyingFunction();
さらに明確にするために-get()が実際に元のオブジェクトへの参照を返すのか、元のオブジェクトのコピーのみを返すのか心配です。
get()
は、オブジェクトへの参照を返しますが、コピーは返しません。返された参照に対して行う変更は、オブジェクト自体に対して行われます
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を出力します。
これは、ArrayListに保存したオブジェクトの種類によって異なります。たとえば、Java.lang.String
s、呼び出しは何も変更しません。そうでなければ、はい、インデックス0に保存されているオブジェクトを変更します。
Javaはオブジェクトのコピーを返さず、オブジェクトの参照へのコピーのみを返します。したがって、メソッドはインデックス0のオブジェクトを確実に変更します。
メソッドがオブジェクトを作成する場合、オブジェクトの「コピー」を取得できます。可能であればreturn object.clone();
を使用しますが、実際にが返されるのは、メソッドでまだ作成されたコピーへの参照です。したがって、より広い意味でオブジェクトの「コピー」を取得することはできますが、ArrayList#get(...)
はそれを行いません。明示的に指定されていない限り、どちらのゲッターもこれを行いません。
オブジェクトへの参照を提供するため、関数がその状態で何らかの変更を実行すると、オブジェクトが変更されます。
これを行うと同じことが起こります:
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
以下に例を示します。リスト内の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;
}
}
リスト内のオブジェクトを更新します。
for (User user: Users) {
user.setName( user.getName() + " New Name");
}
更新されたオブジェクトを表示
for (User user: Users) {
System.out.println( user.getName());
}