初學java,請問為什麼將ArrayList對象get方法的返回值賦給一個引用,操作這個引用不會影響ArrayList對象內對應元素呢?
List list = new ArrayList();
list.add("abc");
String stri = list.get(0);
stri += "def";
System.out.println(stri);
System.out.println(list);
輸出結果為:
abcdef
[abc]
但是我看到的ArrayList的get方法就是在判斷index是否超范圍之後直接return (E) elementData[index];為什麼對引用stri的操作不會改變list的元素呢?
剛開始學java,很多東西沒弄清楚,求前輩指點一下.m(__)m
主要是String類型的數據其實是不可變的,
stri += "def";
分解成
stri = stri + "def"即 stri = "abc" + "def"
這步操作,你要這樣理解:
假定開始的時候內存中一塊空間A存放“abc”,並且名字是stri
可以表示為: stri -> A("abc")
而對於String類型來說,他已經分配的內存是不能改動的,也就是不會在A空間的“abc”後面追加內容,所以做加法操作的時候,會重新分配一塊內存B來存放計算結果,
也就是B("abcdef")
並將內存B地址賦值給stri,
顯然,stri所引用的內存地址都變了,stri已經不是原先list裡面的那個了。