1. 程式人生 > >關於ArrayList儲存區域性變數和全域性變數的易錯筆記

關於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


總結:從基礎打起,學到的東西更多呢。