posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JDK1.5 源碼閱讀筆記 (2)

          Posted on 2007-05-04 13:11 ZelluX 閱讀(930) 評論(0)  編輯  收藏 所屬分類: OOP
          java.util.AbstractCollection
          感謝BBS上的outerheaven解答了add(E o)方法的問題。在把add方法寫成拋出異常不是為了防止子類向上轉型時錯誤地調用AbstractCollection的這個方法,而是為了讓不支持add方法的子類繼承,比如EnumSet類,它的元素是在創建時就決定的,不支持add方法。

          java.util.AbstractList
          1) 包含了
          private class Itr implements Iterator<E>
          private class ListItr extends Itr implements ListIterator<E>
          而ListIterator又是繼承Iterator接口的。
          分成兩個類寫是不是為了使代碼清晰呢?

          2) 使用了modCount變量檢查并發操作時容易發生的問題。
          Iterator中有一個expectedModCount變量,每次通過Iterator操作時,都會調用checkForComodification()方法,檢查expectedModCount是否和AbstractList的modCount相等,如果不同則拋出ConcurrentModificationException。

          3) subList方法和SubList類和視圖view有關(是不是Observer模式的應用呢?),先不看了

          4) equals方法中最后那個判斷語句有點新穎(或者我土了)
          public boolean equals(Object o) {
            
          if (o == this)
              
          return true;
            
          if (!(o instanceof List))
              
          return false;

            ListIterator
          <E> e1 = listIterator();
            ListIterator e2 
          = ((List) o).listIterator();
            
          while(e1.hasNext() && e2.hasNext()) {
              E o1 
          = e1.next();
              Object o2 
          = e2.next();
              
          if (!(o1==null ? o2==null : o1.equals(o2)))
                
          return false;
              }

              
          return !(e1.hasNext() || e2.hasNext());
            }

          }

          5) hashCode的生成:
          hashCode(e1, e2, ..., en) = Sigma(hashCode(ei) * 32^i)
          沒有考慮溢出之類的情況,因為只是個hashCode嘛

          主站蜘蛛池模板: 林州市| 怀远县| 洛南县| 清徐县| 佛坪县| 鹤庆县| 柞水县| 攀枝花市| 晋宁县| 荥阳市| 开原市| 左云县| 会宁县| 东乡| 三门峡市| 瑞安市| 托里县| 青浦区| 昌江| 闽清县| 萨嘎县| 阿巴嘎旗| 河北省| 武宣县| 河西区| 永修县| 昌吉市| 丽水市| 麻栗坡县| 军事| 河南省| 天等县| 洪江市| 雅安市| 德昌县| 梓潼县| 长汀县| 新巴尔虎右旗| 阳江市| 嘉善县| 隆尧县|