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没有被重写)
1,同一对象,相等;
2,size相等,且对应key的value值完全相同,相等。
3,HashMap自身的equals被重写了,但是HashMap里键对象equals并没有被重写,所以如果HashMap中的键为自定义的对象,仍需要重写该对象的equals
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
推荐阅读
-
简洁的Bash编程技巧 <转>
-
<转>MySQL中进展树状所有子节点的查询(写函数)
-
简洁的Bash编程技巧续篇 <转>
-
简洁的Bash编程技巧续篇 <转>
-
Spring Formatter&lt;T&gt; 对Spring MVC接受的参数格式化
-
JS实现点击按钮复制<input>标签中的值到剪贴板
-
<转>深入mysql慢查询设立的详解
-
PHP截取网页源码内所有<a>标签并形成数组的方法
-
使用PHP实现密保卡功能实现代码<打包下载直接运行>_PHP教程
-
<转>MySQL中进展树状所有子节点的查询(写函数)