您的位置:首页 > 其它

LinkedList源码解析

2012-11-29 17:13 267 查看


LinkedList解析

2012-02-14 23:14:12| 分类: Java
SE | 标签:list linkedlist collection |字号 订阅

LinkedList解析

构造

private transient Entry<E> header = new Entry<E>(null, null, null);

private transient int size =
0;

/**

* Constructs an empty list.

*/

public LinkedList() {

header.next = header.previous = header;

}

private static class Entry<E>
{

E element;

Entry<E> next;

Entry<E> previous;

....

}

备注:LinkedList是以链表形式存储的,其元素Entry具有两个指针,分别指向前一个元素和后一个元素

Add


1.顺序添加

public boolean add(E
e) {

addBefore(e, header);

return true;

}

private Entry<E> addBefore(E
e, Entry<E> entry) {

Entry<E> newEntry = new Entry<E>(e,
entry, entry.previous);

newEntry.previous.next =
newEntry;

newEntry.next.previous =
newEntry;

size++;

modCount++;

return newEntry;

}

备注:双链表的链表头顺序最后一个元素也就是表头的逆序previous


2.索引添加

public void add(int index,
E element) {

addBefore(element, (index==size ? header :
entry(index)));

}

/**

* Returns the indexed entry.

*/

private Entry<E> entry(int index)
{

if (index
< 0 || index >= size)

throw new IndexOutOfBoundsException("Index:
"+index+

",
Size: "+size);

Entry<E> e = header;

if (index
< (size >> 1)) {

for (int i
= 0; i <= index; i++)

e = e.next;

} else {

for (int i
= size; i > index; i--)

e = e.previous;

}

return e;

}

备注:index
< (size >> 1) 确定查找顺序,向前查找还是向后查找

indexOf

public int indexOf(Object
o) {

int index
= 0;

if (o==null)
{

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;

}

备注: 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1

注意:在判断是否包含一个元素时候,在这里只判断了当前元素是否equals要判断的元素,并没有进行hashcode的判断。

Contains

public boolean contains(Object
o) {

return indexOf(o)
>= 0;

}

get

public E get(int index)
{

RangeCheck(index);

return (E) elementData[index];

}

private void RangeCheck(int index)
{

if (index
>= size)

throw new IndexOutOfBoundsException(

"Index:
"+index+", Size: "+size);

}

remove

public boolean remove(Object
o) {

if (o==null)
{

for (Entry<E>
e = header.next;
e != header; e = e.next)
{

if (e.element==null)
{

remove(e);

return true;

}

}

} else {

for (Entry<E>
e = header.next;
e != header; e = e.next)
{

if (o.equals(e.element))
{

remove(e);

return true;

}

}

}

return false;

}

private E remove(Entry<E>
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: