1. 程式人生 > >Android進階 四 一個APP引發的思索之ArrayList的add總是新增相同的值

Android進階 四 一個APP引發的思索之ArrayList的add總是新增相同的值

 

解決“ArrayListadd總是新增相同的值”問題

前言

      最近在寫一個小的Android APP,在用ArrayListadd時,總是出現新增相同值的現象。如下圖所示:

 

錯誤結果

程式碼如下:

 

listItem = new HashMap<String, Object>();
for (Item item : resultItems) {
// 獲取相關車次
listItem.put("Station_train_code", item.getStation_train_code());
System.out.println(listItem);
listItems.add(listItem);
}

 

      經過一番思索後,更改後的原始碼如下:

 

for (Item item : resultItems) {
listItem = new HashMap<String, Object>();
// 獲取相關車次
listItem.put("Station_train_code", item.getStation_train_code());
System.out.println(listItem);
listItems.add(listItem);
}

      後經查閱資料得知,若將listItem = new HashMap<String, Object>();

置於for迴圈體外的話,listItem只存在一個物件,而listItems.add(listItem);時,只是把listItem的引用傳進去了。故listItems中存放的值都是最後一個listItem的值。其記憶體分配示意圖如下圖所示:


記憶體分配示意圖

   若將listItem = new HashMap<String, Object>();置於for迴圈體內的話,則會在每一次迴圈中建立一個新的listItem物件。從而在執行listItems.add(listItem);時,會把不同的listItem

物件的引用傳給listItems,從而得到正確結果,如下圖所示:

 

                                                                     正確結果

    其實在Java中,也可以這樣理解:java中是存在指標的!對於基本資料型別(應該是那8種吧),java傳的是值,非基本型別,傳的是引用! 

美文美圖

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed