java - ArrayList修改 "get"方法返回的值

标签 java android arraylist

<分区>

我有以下两种与 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 时,我看到更改正在反射(reflect)。

但是当我修改 String ArrayList 时,同样的方式,然后更改没有反射(reflect)出来。

get 方法在这两种情况下有什么不同?
是否在 String 的情况下,String 类创建深拷贝并返回新对象,而在 Custom 类的情况下创建浅拷贝?

第一种场景适用于“LinkedHashMap”、“HashMap”和“List”?

最佳答案

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

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

myObj2.myInt = 20;

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

myStr1 = "Test_20";

如果 String 是可变的,您可以通过调用一些方法来修改 String,并且更改会反射(reflect)在存储在列表中的对象中:

myStr1.setSomething(...);

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

myObj2 = new MyClass (...);

关于java - ArrayList修改 "get"方法返回的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29118935/

相关文章:

java - 获取 Java 小程序的屏幕截图

java - 无法解析方法 'setImageResource' (android.graphics.drawable.Drawable)

java - 如何解决越界异常错误?

Java - 就性能而言,哪个集合最适合这种情况?

Java 泛型 : is-A relation to Object

java - Kafka Listener方法发生异常时不提交offset

java - 字符串排列解释?

java - 如何将 TextView 添加到 ScrollView

安卓/Java : Can't find MultipartEntity class despite adding it to build path

java - 数组列表。按产品类型按文章访问名称