Snowdream

I'm awake but my world is half asleep
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JDK1.5 源码阅读笔记 (2)

Posted on 2007-05-04 13:11 ZelluX 阅读(834) 评论(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嘛


只有注册用户登录后才能发表评论。


网站导航: