android list 比较,LinkedList 和 ArrayList 的区别

## 區(qū)別
* ArrayList 動(dòng)態(tài)數(shù)組
* LinkedList 雙向鏈表,它同樣可以被當(dāng)作棧、隊(duì)列或雙端隊(duì)列來(lái)使用
* 對(duì)ArrayList和LinkedList而言,在列表末尾增加一個(gè)元素所花的開(kāi)銷(xiāo)都是固定的。對(duì)ArrayList而言,主要是在內(nèi)部數(shù)組中增加一項(xiàng),指向所添加的元素,偶爾可能會(huì)導(dǎo)致對(duì)數(shù)組重新進(jìn)行分配;而對(duì)LinkedList而言,這個(gè)開(kāi)銷(xiāo)是統(tǒng)一的,分配一個(gè)內(nèi)部Entry對(duì)象。
* 在ArrayList的中間插入或刪除一個(gè)元素意味著這個(gè)列表中剩余的元素都會(huì)被移動(dòng);而在LinkedList的中間插入或刪除一個(gè)元素的開(kāi)銷(xiāo)是固定的。
* LinkedList不支持高效的隨機(jī)元素訪問(wèn)。
* ArrayList的空間浪費(fèi)主要體現(xiàn)在在list列表的結(jié)尾預(yù)留一定的容量空間,而LinkedList的空間花費(fèi)則體現(xiàn)在它的每一個(gè)元素都需要消耗相當(dāng)?shù)目臻g
## 總結(jié):
LinkedList 在查找指定位置元素的時(shí)候,會(huì)先根據(jù)傳入的 index 和當(dāng)前 size 的一半作比較。如果小于當(dāng)前的一半,就從頭節(jié)點(diǎn)遍歷,如果大于當(dāng)前size 的一半,從尾節(jié)點(diǎn)開(kāi)始遍歷。
實(shí)現(xiàn)如下:
~~~
Node node(int index) {
// assert isElementIndex(index);
// 如果小于當(dāng)前 size 的一半,從頭節(jié)點(diǎn)開(kāi)始遍歷
if (index < (size >> 1)) {
Node x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
// 這里是大于當(dāng)前 size 的一半,從尾節(jié)點(diǎn)開(kāi)始遍歷
Node x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
~~~
可以這樣說(shuō):當(dāng)操作是在一列數(shù)據(jù)的**后面添加數(shù)據(jù)而不是在前面或中間**,并且需要隨機(jī)地訪問(wèn)其中的元素時(shí),使用ArrayList會(huì)提供比較好的性能;當(dāng)你的操作是在一列數(shù)據(jù)的**前面或中間添加或刪除數(shù)據(jù),**并且按照順序訪問(wèn)其中的元素時(shí),就應(yīng)該使用LinkedList了。
總結(jié)
以上是生活随笔為你收集整理的android list 比较,LinkedList 和 ArrayList 的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cuda8.0.44linux.run,
- 下一篇: android n等分 layout,R