今天看了下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     }

大牛写的方法,用迭代器来进行遍历,高效,而且不像我的方法一样有很多看似很怪异的实现方式。这种简洁高效的代码,才是最牛逼的。

好好学一学吧,这一年的工作也收获了很多,学的越多,越明白自己缺什么。这是第一篇博客,希望自己能够坚持下去!

posted @ 2015-07-31 15:28  michaelfaust  阅读(178)  评论(0)    收藏  举报