今天看了下abstractMap和hashMap的源码
很长一段时间以来,都没有这个意识去看源码
今天code review的时候,因为自己实现了一段hashcode的compare方法,所以大家拎出来说了一说
1 private boolean compareHashMap(Map<String, Object> newMap, Map<String, Object> originMap) { 2 Map<String, Object> copyNewMap = new HashMap<String, Object>(newMap); 3 for (Map.Entry<String, Object> entry : originMap.entrySet()) { 4 Object newMapObject = copyNewMap.get(entry.getKey()); 5 if (!copyNewMap.containsKey(entry.getKey())) { 6 return false; 7 } else { 8 if (newMapObject != null && entry.getValue() != null) { 9 if (!newMapObject.equals(entry.getValue())) { 10 return false; 11 } 12 copyNewMap.remove(entry.getKey()); 13 } else if (newMapObject == null && entry.getValue() == null) { 14 copyNewMap.remove(entry.getKey()); 15 } else { 16 return false; 17 } 18 } 19 } 20 21 if (copyNewMap.size() != 0) { 22 return false; 23 } 24 return true; 25 }
实现方式是这样的,虽然跑起来性能也不是很差,但是在运行的过程中,会用到三个map的space。所以就去看了下abstractMap的实现方式。
1 public boolean equals(Object o) { 2 if (o == this) 3 return true; 4 5 if (!(o instanceof Map)) 6 return false; 7 Map<K,V> m = (Map<K,V>) o; 8 if (m.size() != size()) 9 return false; 10 11 try { 12 Iterator<Entry<K,V>> i = entrySet().iterator(); 13 while (i.hasNext()) { 14 Entry<K,V> e = i.next(); 15 K key = e.getKey(); 16 V value = e.getValue(); 17 if (value == null) { 18 if (!(m.get(key)==null && m.containsKey(key))) 19 return false; 20 } else { 21 if (!value.equals(m.get(key))) 22 return false; 23 } 24 } 25 } catch (ClassCastException unused) { 26 return false; 27 } catch (NullPointerException unused) { 28 return false; 29 } 30 31 return true; 32 }
大牛写的方法,用迭代器来进行遍历,高效,而且不像我的方法一样有很多看似很怪异的实现方式。这种简洁高效的代码,才是最牛逼的。
好好学一学吧,这一年的工作也收获了很多,学的越多,越明白自己缺什么。这是第一篇博客,希望自己能够坚持下去!

浙公网安备 33010602011771号