Android進階 四 一個APP引發的思索之ArrayList的add總是新增相同的值
阿新 • • 發佈:2018-12-22
解決“ArrayList的add總是新增相同的值”問題
前言
最近在寫一個小的Android APP,在用ArrayList的add時,總是出現新增相同值的現象。如下圖所示:
錯誤結果
程式碼如下:
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