java arraylist 常用方法_分享ArrayList中的几个常用方法的源码
jdk1.7.0_79
上文里解析了有關(guān)ArrayList中的幾個(gè)常用方法的源碼——《有關(guān)ArrayList常用方法的源碼解析》,本文將對(duì)LinkedList的常用方法做簡(jiǎn)要解析。
LinkedList是基于鏈表實(shí)現(xiàn)的,也就是說它具備了鏈表的優(yōu)點(diǎn)和缺點(diǎn),隨機(jī)訪問慢、插入刪除速度快。既然是鏈表,那么它就存在節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu),也不存在容量大小的問題,來一個(gè)在尾部添加一個(gè)。
//LinkedList$Nodeprivate static class Node {
E item;
Node next;
Node prev;
Node(Node prev, E element, Node next) {this.item = element;this.next = next;this.prev = prev;
}
}
第一個(gè)默認(rèn)不帶參數(shù)的構(gòu)造方法,構(gòu)造一個(gè)空鏈表。
//1.LinkedList,默認(rèn)構(gòu)造方法public LinkedList() {
}
第二個(gè)構(gòu)造方法能把一個(gè)集合作為一個(gè)參數(shù)傳遞,同時(shí)集合中的元素需要是LinkedList的子類。
//2.LinkedList,能將一個(gè)集合作為參數(shù)的構(gòu)造方法public LinkedList(Collection extends E> c) {this();
addAll(c);
}
兩個(gè)構(gòu)造方法都比較簡(jiǎn)單,接下來看元素的插入及刪除等方法。
public boolean add(E e) {
linkLast(e); //將元素添加到鏈表尾部return true;
}
//LinkedList#linkLastvoid linkLast(E e) {final Node l = last; //鏈表尾指針引用暫存final Node newNode = new Node<>(l, e, null); //構(gòu)造新節(jié)點(diǎn)last = newNode; //將鏈表的尾指針指向新節(jié)點(diǎn)if (l == null) //此時(shí)為第一次插入元素first = newNode;elsel.next = newNode;
size++; //鏈表數(shù)據(jù)總數(shù)+1modCount++; //modCount變量在《有關(guān)ArrayList常用方法的源碼解析》提到過,增刪都會(huì)+1,防止一個(gè)線程在用迭代器遍歷的時(shí)候,另一個(gè)線程在對(duì)其進(jìn)行修改。}
學(xué)過《數(shù)據(jù)結(jié)構(gòu)》的同學(xué)相信看到鏈表的操作不會(huì)感到陌生,接著來看看刪除指定位置的元素remove(int)方法。
//LinkedList#removepublic E remove(int index) {
checkElementIndex(index); //檢查是否越界 index >= 0 && index <= sizereturn unlink(node(index)); //調(diào)用node方法查找并返回指定索引位置的Node節(jié)點(diǎn)}
//LinkedList#node,根據(jù)索引位置返回Node節(jié)點(diǎn)Node node(int index) {if (index < (size >> 1)) { //size >> 1 = size / 2,如果索引位于鏈表前半部分,則移動(dòng)fisrt頭指針進(jìn)行查找Node x = first;for (int i = 0; i < index; i++)
x = x.next;return x;
} else { //如果索引位于鏈表后半部分,則移動(dòng)last尾指針進(jìn)行查找Node x = last;for (int i = size - 1; i > index; i--)
x = x.prev;return x;
}
}
查找到index位置的Node后,調(diào)用unlink方法摘掉該節(jié)點(diǎn)。
//LinkedList#unlink,一看即懂E unlink(Node x) {// assert x != null;final E element = x.item;final Node next = x.next;final Node prev = x.prev;if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
}if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}
x.item = null;
size--;
modCount++;return element;
}
從代碼中就能看出LinkedList和ArrayList兩者的優(yōu)缺點(diǎn),由于只涉及簡(jiǎn)單的鏈表數(shù)據(jù)結(jié)構(gòu),所以不再對(duì)其他方法進(jìn)行解析。
總結(jié)
以上是生活随笔為你收集整理的java arraylist 常用方法_分享ArrayList中的几个常用方法的源码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java serializable 源码
- 下一篇: java spring eventbus