List<Map>:HashMap自身的equals实现

1,如下代码所示,对List<Map>进行map的添加和删除,androidPics.contains(pic)的判断是新创建的对象存在,且我在移除新创建的pic时,发现List集合中的逻辑相等的map对象被移除了,说明了map对象作为List的键值时,其equals不是Object.equals,而应该是对其进行了重写(注:但是hashMap的键的quals没有被重写)
 
 
       List<Map<String, Object>> androidPics = bizSplashScreen.getAndroidPics();
       Map<String, Object> pic;
        List<Long> needDeleteIds = Lists.newArrayList();
        List<String> deleteImages = Lists.newArrayList();
        for (BizLaunchImage bizLaunchImage : bizLaunchImages) {
            pic = new HashMap<String, Object>();
            pic.put("name", bizLaunchImage.getImageUrl());
            pic.put("width", bizLaunchImage.getDeviceWidth());
            pic.put("height", bizLaunchImage.getDeviceHeight());
            pic.put("flag", bizLaunchImage.getFlag());
            if (bizLaunchImage.getPlatform() == PlatformTypeEnum.ANDROID.getType() && androidPics.contains(pic)) {
                androidPics.remove(pic);
            } else if (bizLaunchImage.getPlatform() == PlatformTypeEnum.IOS.getType() && iphonePics.contains(pic)) {
                iphonePics.remove(pic);
            } else if (bizLaunchImage.getPlatform() == PlatformTypeEnum.IPAD.getType() && ipadPics.contains(pic)) {
                ipadPics.remove(pic);
            } else {
                deleteImages.add(bizLaunchImage.getImageUrl());
                needDeleteIds.add(bizLaunchImage.getId());
            }
        }
2,查看HashMap的equals的源码如下:
public boolean equals(Object o) {
//1.同一对象,对象相等
        if (o == this)
            return true;
//2.类型不是Map,对象不相等
        if (!(o instanceof Map))
            return false;
        Map<?,?> m = (Map<?,?>) o;
//3.size不等,对象不相等
        if (m.size() != size())
            return false;

        try {
            Iterator<Entry<K,V>> i = entrySet().iterator();
            while (i.hasNext()) {
                Entry<K,V> e = i.next();
                K key = e.getKey();
                V value = e.getValue();
//4.如果value为空,对应的对象value不为空或者根本没有这个key,对象不相等
                if (value == null) {
                    if (!(m.get(key)==null && m.containsKey(key)))
                        return false;
                } else {
 //如果value不为空,对应map相同key的value值是否相等,不等则对象不相等
                    if (!value.equals(m.get(key)))
                        return false;
                }
            }
        } catch (ClassCastException unused) {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }

        return true;
    }
3,总结下:
1,同一对象,相等;
2,size相等,且对应key的value值完全相同,相等。
3,HashMap自身的equals被重写了,但是HashMap里键对象equals并没有被重写,所以如果HashMap中的键为自定义的对象,仍需要重写该对象的equals


猜你喜欢

转载自blog.csdn.net/qq_2300688967/article/details/79467224
今日推荐