1. 程式人生 > >Java中List<E>對象賦值問題(深淺拷貝)

Java中List<E>對象賦值問題(深淺拷貝)

不能 沒有 add size for .get one util contains

Java中List<E>對象賦值操作問題

業務需求是:取2個集合中的交集對象並返回。如下代碼,busMap中key值和stocks中Map中的key值相等的對象則返回繼續操作,也就是說剔除stocks中的不存在於busMap中的對象,就是一個過濾操作。

實現代碼 ① bug版
報錯:
java.util.ConcurrentModificationException ; at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) ; at java.util.ArrayList$Itr.next(ArrayList.java:831) ;

原因:
forEach實現是采用Iterator實現的,而remove操作不能在Iterator下操作,所以報錯

private static void  appendStock(Map<String,Object> busMap, List<Map<String, Object>> stocks , String key){
    if (stocks != null)
        for (Map<String,Object> s : stocks ) {
            boolean b = false;
            for (Map.Entry<String, Object> e : busMap.entrySet()) {
                if (s.get("stock_code") != null)
                    if (s.get("stock_code").toString().equals(e.getKey())) {
                        b = true;
                        break;
                    }
            }
            if ( !b ){
                stocks.remove(s);
            }
        }
}

代碼② 修正foreach中remove異常,bug版
bug:
執行該方法後,stocks並沒有改變!!
原因:
對象淺拷貝導致

private static void  appendStock(Map<String,Object> busMap, List<Map<String, Object>> stocks , String key){
    if (stocks != null)
        List<Map<String,Object>> newStocks =  Lists.newArrayList();  // 構建新對象保存交集數據
        for (Map<String,Object> s : stocks ) {
            for (Map.Entry<String, Object> e : busMap.entrySet()) {
                if (s.get("stock_code") != null)
                    if (s.get("stock_code").toString().equals(e.getKey())) {
                        newstocks.add(s);
                        break;
                    }
            }
        }
        stocks = newStocks;
}

代碼③ 繞開淺拷貝,穩定版
采用Iterator來刪除元素,摒棄拷貝,從而不入淺拷貝的坑

private static void  appendStock(Map<String,Object> busMap, List<Map<String, Object>> stocks , String key){
    if (stocks != null && stocks.size() > 0) {
        Iterator<Map<String, Object>> iterator = stocks.iterator();
        while (iterator.hasNext()) {
            Map<String, Object> s = iterator.next();
            if (s.get("stock_code") != null) {
                String stockCode = String.valueOf(s.get("stock_code"));
                if ( !busMap.containsKey(stockCode)) {
                    iterator.remove();
                }
            }
        }
    }
}

代碼④修正淺拷貝,穩定版

Java中List<E>對象賦值問題(深淺拷貝)