『java.util』 AbstractCollection

来源:互联网 发布:g3开票软件 编辑:程序博客网 时间:2024/06/06 04:33

 这个抽象类实现了collection接口,实现了collection的部分方法:

1. isEmpty();   return size()==0;  设计很精妙啊

2. contain(Object o);  实现方式还是用迭代器来迭代整个集合来比较o是不是在集合里面的

3. Object[]  toArray();   他的实现方法很诡异啊 , 代码如下

    public Object[] toArray() {        // Estimate size of array; be prepared to see more or fewer elements        Object[] r = new Object[size()];        Iterator<E> it = iterator();        for (int i = 0; i < r.length; i++) {            if (! it.hasNext()) // fewer elements than expected                return Arrays.copyOf(r, i);            r[i] = it.next();        }        return it.hasNext() ? finishToArray(r, it) : r;    }
得到了size之后还有判断两次it.hasNext(),第一次的判断,难道迭代器中间的位置会有null么,还有最后的it.hasNext(),上面已经得到迭代器的size了,把这个长度里面内容都已经放到Object数组里面了,it.hasNext()肯定是null了啊。或者难道说这就是线程不安全的证明么?这样是为了提供线程安全性么,个人认为是防止在进行toArray操作的时候,集合被其他线程改变了。补充:这两次判断是用来防止,在得到size()和创建迭代器之间,容器的大小发生了改变,比如容器remove和add了,而不是用来防止线程不安全。(其实仔细想,还是会有防止不安全的成分在里面,)


4. <T>  T[]   toArray(T[] a);   实现方式和上面差不多,多了判断a是否能完成的放下整个容器的对象。代码太神奇了

5. <T> T[]  finishToArray();  当迭代器的长度大于上面得到的size的时候,就用调用这个方法把迭代器没有叠带到的部分放到数组里面,

//未完成待续。

补充 小小知识点,:

1. 数组的大小是不可以改变的,system.copyof();拷贝数组


ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引  但是缺点就是查找非常麻烦 要丛第一个索引开始

0 0
原创粉丝点击