码迷,mamicode.com
首页 > 编程语言 > 详细

Java中List<E>对象赋值问题(深浅拷贝)

时间:2018-08-22 14:03:34      阅读:719      评论:0      收藏:0      [点我收藏+]

标签:current   list()   entry   vat   lse   key   except   相等   java   

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>对象赋值问题(深浅拷贝)

标签:current   list()   entry   vat   lse   key   except   相等   java   

原文地址:http://blog.51cto.com/11939788/2162805

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!