List<Map>:Ha

2019-04-15 17:52发布

1,如下代码所示,对List进行map的添加和删除,androidPics.contains(pic)的判断是新创建的对象存在,且我在移除新创建的pic时,发现List集合中的逻辑相等的map对象被移除了,说明了map对象作为List的键值时,其equals不是Object.equals,而应该是对其进行了重写(注:但是hashMap的键的quals没有被重写)
      List> androidPics = bizSplashScreen.getAndroidPics(); Map pic; List needDeleteIds = Lists.newArrayList(); List deleteImages = Lists.newArrayList(); for (BizLaunchImage bizLaunchImage : bizLaunchImages) { pic = new HashMap(); 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> i = entrySet().iterator(); while (i.hasNext()) { Entry 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