Java新手天坑! 想寫一篇新手避坑向的文章很久了,最近來到園子,終於有機會發表這篇文章了(文筆和技術都不咋地,大佬見諒,適用於剛入坑沒多久的新手群體) 在java中,經過一段學習的人對數組操作應該是瞭如指掌了,但是剛剛入門的小白來說,數組卻存在著一個隱藏的大坑,我們先用Python示例一下: #l ...
Java新手天坑!
想寫一篇新手避坑向的文章很久了,最近來到園子,終於有機會發表這篇文章了(文筆和技術都不咋地,大佬見諒,適用於剛入坑沒多久的新手群體)
在java中,經過一段學習的人對數組操作應該是瞭如指掌了,但是剛剛入門的小白來說,數組卻存在著一個隱藏的大坑,我們先用Python示例一下:
#list.py
arr1 = [5418,114514,666]
arr2 = arr1
arr1[0] = 1
arr2[0] = 2
print(arr1[0])
print(arr2[0])
程式輸出結果為:
2
2
哎?
這,這不對吧?arr1 和 arr2 明明是兩個不一樣的列表,怎麼arr2 改到arr1里了呢?
這是新手很容易遇到的問題,我們添加一行代碼,來驗證一下猜想。
#依舊是list.py
print(arr1 is arr2)
啥意思呢,is不太常用,給大家解釋一下,就是判斷兩個變數、列表(我通常稱其為實體,更精確一些)在記憶體中的地址是否相同,如果相同的話,我們就知道問題發生的原因了。
程式輸出如下:
2
2
True
果然,正是因為記憶體中的地址一樣,所以更改arr2時,arr1也一同更改了,這倆貨本質上一毛一樣!
可以這麼理解,數據是記憶體中的文件,arr1和arr2只是快捷方式。
我們把代碼在java里實現:
public class ListTest {
public static void main(String[] args) {
int[] a = {1,2,3};
int[] b = a;
a[0] = 10;
b[0] = 11;
System.out.println(a[0]);
System.out.println(b[0]);
}
}
一開始的記憶體如圖所示:
後來arr1把114514位置的值修改為了10
最後arr1把114514位置的值修改為了11
最後二者的[0]都為11
你,學廢了嗎?