这个抽象类实现了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 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始