【发布时间】:2015-03-18 09:57:43
【问题描述】:
我有以下两种与ArrayListget方法相关的情况,一种是自定义类,一种是String类:
1.下面是修改自定义类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"
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"
所以在 MyClass ArrayList 的情况下,当我调用 get 并修改值时,当我再次调用 get 时,我看到变化正在反映。
但是,当我修改 String ArrayList 时,更改不会反映。
get 方法在这两种情况下有何不同?
是不是在String的情况下,String类创建深拷贝并返回新对象,而在Custom类的情况下创建浅拷贝?
第一种场景适用于“LinkedHashMap”、“HashMap”和“List”?
【问题讨论】:
-
如果为 -1 提供了解释,将会有很大帮助。因此,我可以更新/删除问题。请提供-1的解释。
-
这两个
get()没有区别:它们都返回对列表中包含的对象的引用。但是在这两种情况下你都不会做同样的事情:1- 你修改了被引用对象的成员 (myObj2.myInt = 20;),2- 你尝试修改对对象的引用 (myStr1 = "Test_20";)。如果您尝试在第一种情况下修改引用,您将得到与第二种情况完全相同的结果。