LinkedList源码浅析 (二)

2014-11-24 02:43:04 · 作者: · 浏览: 5
return index;
index++;
}
} else {
for (Entry e = header.next; e != header; e = e.next) {
if (o.equals(e.element))
return index;
index++;
}
}
return -1;
}

/**
*默认的添加动作,可以看到这个方法是把新元素添加 到表尾
*/
public boolean add(E e) {
addBefore(e, header); //加到头结点之前 ,即表尾
return true;
}

/**
*默认的删除动作是删除链表的第一个元素,所以说在默认情况下,LinkedList其实扮*演的是一个队列的角色
*/
public E remove() {
return removeFirst();
}

/**
*返回第一个元素
*/
public E peek() {
if (size==0)
return null;
return getFirst();
}
/**
*将元素e添加到entry结点之前
*/
private Entry addBefore(E e, Entry entry) {
Entry newEntry = new Entry(e, entry, entry.previous);
newEntry.previous.next = newEntry; //将新结点与前后结点相连接
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}


/**
*删除给定的结点e
*/
private E remove(Entry e) {
if (e == header)
throw new NoSuchElementException();

E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}

/**
*从表头开始遍历,返回此元素在表中的第一个位置
*/
public int indexOf(Object o) {
int index = 0;
if (o==null) { //如果传入的元素是null,则不能调用 eqauls方法进行比较
for (Entry e = header.next; e != header; e = e.next) {
if (e.element==null)
return index;
index++;
}
} else {
for (Entry e = header.next; e != header; e = e.next) {
if (o.equals(e.element))
return index;
index++;
}
}
return -1;
}

/**
*默认的添加动作,可以看到这个方法是把新元素添加 到表尾
*/
public boolean add(E e) {
addBefore(e, header); //加到头结点之前 ,即表尾
return true;
}

/**
*默认的删除动作是删除链表的第一个元素,所以说在默认情况下,LinkedList其实扮*演的是一个队列的角色
*/
public E remove() {
return removeFirst();
}

/**
*返回第一个元素
*/
public E peek() {
if (size==0)
return null;
return getFirst();
}


可以看出,如果表为空的时候 ,这个方法并不会抛出异常,而是返回null,而传统的(在Collections中声明的)方法则会抛出异常。相似的方法还有:poll,但请注意pop方法在表空的时候 会抛出异常。

还有一点请注意,如果先返回list的Iterator,之后 又对链表进行了添加删除修改操作,那么如果再使用返回的那个Iterator就会抛出ConcurrentModificationException。

最后看一下LinkedList是如何序列化和反序列化的,如果对这两个反序列化中用到的这两个回调方法有疑问的,可以看我的这篇博客 http://blog.csdn.net/moreevan/article/details/6697777

view plaincopy to clipboardprint /**
* Save the state of this LinkedList instance to a stream (that
* is, serialize it).
*
* @serialData The size of the list (the number of elements it
* contains) is emitted (int), followed by all of its
* elements (each an Object) in the proper order.
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
// Write out any hidden serialization magic
s.defaultWriteObject();

// Write out size
s.writeInt(size);

// Write out all elements in the proper order.
for (Entry e = header.next; e != header; e = e.next)
s.writeObject(e.element);
}

/**
* Reconstitute this LinkedList instance from a stream (that is
* deserialize it).
*/
private void readObject(java.io.ObjectInputStream s)