1. 程式人生 > >SSM專案問題中遇到 ArrayList新增元素的問題

SSM專案問題中遇到 ArrayList新增元素的問題

記錄專案開發中 一次有趣的debug經歷

本來是在做單元測試的,但是發現如下程式碼 有問題..

ProductCategory p = new ProductCategory();
for (int i = 1; i <= 5; i++) {
    p.setCreateTime(new Date());
    p.setPriority(i);
        p.setShopId((long)(i));
    p.setProductCategoryName("測試店鋪種類"+(i+3));
    list.add(p);
}

列印list裡面物件的ProductCategoryName
發現如下

測試店鋪種類8
測試店鋪種類8
測試店鋪種類8
測試店鋪種類8
測試店鋪種類8

我甚至還以為是ArrayList的add函式會去重 (人工智障),看了一下原始碼

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
}

發現沒什麼不妥。
多測試了幾下 發現 list 每次增加物件的時候 list是單純把相應index賦值為物件。
因此我上面物件 看似存了5次,但其實,最後列印的時候 列印的是同一個物件, 即最後一次的修改資訊
所以有 5個測試店鋪種類8

正確寫法

每次new一個新的物件 加入到list中

for (int i = 1; i <= 5; i++) {
    p = new ProductCategory(null,(long)i,"test"+i+10,i,new Date());
    //p.setCreateTime(new Date());
    //p.setPriority(i);
    //p.setShopId((long)(i));
    //p.setProductCategoryName("測試店鋪種類"+(i+3));
    list.add(p);
}

感悟

本身那麼建立一個物件,目的是為了減少記憶體開銷
但是這樣做的結果就是list中儲存的物件都是用一個
特此標註一下 謹防以後再犯錯