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

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

          Posted on 2007-05-04 13:11 ZelluX 閱讀(935) 評論(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嘛

          主站蜘蛛池模板: 岱山县| 黎城县| 保德县| 山丹县| 康保县| 抚顺县| 淮滨县| 山西省| 嘉兴市| 黄大仙区| 巩留县| 西丰县| 洪洞县| 湛江市| 夏邑县| 万年县| 宝应县| 中牟县| 阜阳市| 乌拉特后旗| 牙克石市| 肇州县| 峨边| 吉木乃县| 雷州市| 奈曼旗| 桃源县| 宿州市| 阿合奇县| 增城市| 泰来县| 平安县| 右玉县| 景德镇市| 景东| 鄂托克旗| 余江县| 岳普湖县| 托里县| 西贡区| 府谷县|