从最核心的Collection 接口开始看;
AbstractCollection 是实现了Collection 的框架类。 AbstractList 是继承与AbstractCollection的, 所以AbstractCollection类是关键。
Collection类最基础的功能是增删查改:都是通过Iterator实现的。 举个例子: Add:AbstractCollection没有实现
Remove:
public boolean remove(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext()) {
if (it.next()==null) {
it.remove();
return true;
}
}
} else {
while (it.hasNext()) {
if (o.equals(it.next())) {
it.remove();
return true;
}
}
}
return false;
}
Contain
public boolean contains(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext())
if (it.next()==null)
return true;
} else {
while (it.hasNext())
if (o.equals(it.next()))
return true;
}
return false;
}
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;
}
所以Collection中最核心的东西就是:Iterator和Size
Iterator[hasnext、next、remove、foreachremaining]
所以List以及Set 最核心的,就是对Collection的Iterator和Size Override
List 类除了Iterator外, 还增加了ListIterator实现了双向的迭代
来看一个:Arraylist:
精简后版本:
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // 游标
int lastRet = -1; // 当前游标的上一个,用于remove
Itr() {}
public boolean hasNext() {
return cursor != size;
}
public E next() {
checkForComodification();
Object[] elementData = ArrayList.this.elementData;
//从此处可以看出 ArrayList是基于数组实现的
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
public void forEachRemaining(Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
final int size = ArrayList.this.size;
int i = cursor;
if (i >= size) {
return;
}
final Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length) {
throw new ConcurrentModificationException();
}
while (i != size && modCount == expectedModCount) {
consumer.accept((E) elementData[i++]);
}
// update once at end of iteration to reduce heap write traffic
cursor = i;
lastRet = i - 1;
checkForComodification();
}
}
HashSet是基于 Hashmap 实现的
public Iterator<E> iterator() {
return map.keySet().iterator();
}
/**
* Returns the number of elements in this set (its cardinality).
*
* @return the number of elements in this set (its cardinality)
*/
public int size() {
return map.size();
}