我有以下两种涉及ArrayList get
方法的情况,一种是使用自定义类,另一种是使用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类创建了深拷贝并返回了新对象,在自定义类的情况下创建了浅拷贝?
第一种情况适用于"LinkedHashMap"、"HashMap"和"List"吗?
get()
没有区别:它们都返回包含在列表中的对象的引用。但是你在这两种情况下做的事情不同:1-修改所引用对象的成员(myObj2.myInt = 20;
),2-尝试修改对象的引用(myStr1 = "Test_20";
)。如果您尝试在第一种情况下修改引用,则会得到与第二种情况完全相同的结果。 - T.Gounelle