欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-03 08:41:41
...
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