關於ArrayList儲存區域性變數和全域性變數的易錯筆記
(一)關於使用ArrayList儲存全域性變數
程式碼如下:
public static void main(String[] args){
Demo demo=new Demo(); //這裡宣告一個全域性變數
List<Demo> demoList=new ArrayList<Demo>(); //宣告一個arraylist儲存物件
for(int i=0;i<3;i++){
demo.setId(i);
demoList.add(demo);
System.out.println(demo);
System.out.println("demoList.get(i):"+demoList.get(i).getId());
}
for(int i=0;i<3;i++){
System.out.println(demoList.get(i).getId()); //用迴圈列印
}
}
輸出結果:
Demo [id=0]
demoList.get(i):0
Demo [id=1]
demoList.get(i):1
Demo [id=2]
demoList.get(i):2
2
2
2
問:為什麼在迴圈輸出時候提取list是相同?
個人總結:
(1)List裡面雖然有3個元素,但是元素的物件指向的地址都是同一個記憶體地址。(2)你只new一次,但是隻為demo分配一個地址,但是每次都是操作這個demo,第一個迴圈。
(3)另外,因為list是允許元素重複的,所以,你同一個物件可以加N次,另一個集合set是不允許元素重複。
元素重複的意思是,記憶體地址一樣
(4)最後一次則新增id為2,則覆蓋之前的id,arraylist則儲存最後一個物件的值。
圖如下:
(二)使用arraylist儲存區域性變數
對於上邊的程式,把宣告放到for迴圈裡面時候,則是不同的指向地址。
public static void main(String[] args){
//Demo demo=new Demo(); //註釋掉,換到for迴圈裡面
List<Demo> demoList=new ArrayList<Demo>();
for(int i=0;i<3;i++){
Demo demo=new Demo();
demo.setId(i);
demoList.add(demo);
System.out.println(demo);
System.out.println("demoList.get(i):"+demoList.get(i).getId());
}
for(int i=0;i<3;i++){
System.out.println(demoList.get(i).getId());
}
}
執行結果:
Demo [id=0]
demoList.get(i):0
Demo [id=1]
demoList.get(i):1
Demo [id=2]
demoList.get(i):2
0
1
2
總結:從基礎打起,學到的東西更多呢。