ArrayList修改“ get”方法返回的值

Use*_*337 5 java android arraylist

我有以下两种与ArrayList get方法相关的情况,一种与自定义类有关,另一种与String类有关:

1.下面是修改Custom类ArrayList元素的示例:

ArrayList<MyClass> mTmpArray1 = new ArrayList<MyClass>();
MyClass myObj1 = new MyClass(10);  
mTmpArray1.add(myObj1);

MyClass myObj2 = mTmpArray1.get(0);  
myObj2.myInt = 20;

MyClass myObj3 = mTmpArray1.get(0);  
Log.d(TAG, "Int Value:"+myObj3.myInt);    // Prints "20" 
Run Code Online (Sandbox Code Playgroud)

2.下面是修改String ArrayList元素的示例:

ArrayList<String> mTmpArray2 = new ArrayList<String>();  
mTmpArray2.add("Test_10");

String myStr1 = mTmpArray2.get(0);
myStr1 = "Test_20";

String myStr2 = mTmpArray2.get(0);
Log.d(TAG, "Str Value:"+myStr2);  // Prints "Test_10" 
Run Code Online (Sandbox Code Playgroud)

因此,在MyClass ArrayList的情况下,当我调用get并修改值时,我看到更改将在get再次执行时反映出来。

但是以同样的方式修改字符串ArrayList时,更改不会反映出来。

get在这两种情况下,该方法有何不同?
是在String的情况下,String类创建深度复制并返回新对象,还是在Custom类的情况下创建浅拷贝?

在适用于“ LinkedHashMap”,“ HashMap”和“ List”的第一种情况下?

Era*_*ran 3

在这两种情况下你没有做同样的事情。

在这里,您更新对象的状态,因此更改会影响存储在列表中的对象:

myObj2.myInt = 20;
Run Code Online (Sandbox Code Playgroud)

这里您将一个新对象分配给局部变量,因此列表不受影响:

myStr1 = "Test_20";
Run Code Online (Sandbox Code Playgroud)

如果String是可变的,您可以通过调用某种方法来修改字符串,并且更改将反映在存储在列表中的对象中:

myStr1.setSomething(...);
Run Code Online (Sandbox Code Playgroud)

另一方面,如果在第一种情况下您更改了局部变量的值,则存储在列表中的对象不会受到影响:

myObj2 = new MyClass (...);
Run Code Online (Sandbox Code Playgroud)