深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較
一、概念:
一般我們都知道ArrayList* 由一個數(shù)組后推得到的 List。作為一個常規(guī)用途的對象容器使用,用于替換原先的 Vector。允許我們快速訪問元素,但在從列表中部插入和刪除元素時,速度卻嫌稍慢。一般只應該用ListIterator 對一個 ArrayList 進行向前和向后遍歷,不要用它刪除和插入元素;與 LinkedList 相比,它的效率要低許多LinkedList 提供優(yōu)化的順序訪問性能,同時可以高效率地在列表中部進行插入和刪除操作。但在進行隨機訪問時,速度卻相當慢,此時應換用 ArrayList。
二、測試
本來自己寫了一些測試類想測試下ArrayList和LinkedList的性能比較,發(fā)現(xiàn)怎么寫都差強人意,今天在《Thinking in Java》中看到了這樣的一段代碼,個人覺得寫得不賴。
public class ListPerformance
{
private static final int REPS = 100;
private abstract static class Tester//內(nèi)部抽象類,作為List測試。
{
String name;
int size;
Tester(String name, int size)
{
this.name = name;
this.size = size;
}
abstract void test(List a);
}
private static Tester[] tests = {new Tester("get", 300)//一個測試數(shù)組,存儲get(隨機取)、iteration(順序遍歷)、insert(中間插入)、remove(隨機刪除)
{
void test(List a)
{
for (int i = 0; i < REPS; i++) {
for (int j = 0; j < a.size(); j++) {
a.get(j);
}
}
}
}, new Tester("iteration", 300)
{
void test(List a)
{
for (int i = 0; i < REPS; i++) {
Iterator it = a.iterator();
while (it.hasNext()) it.next();
}
}
}, new Tester("insert", 1000)
{
void test(List a)
{
int half = a.size() / 2;
String s = "test";
ListIterator it = a.listIterator(half);
for (int i = 0; i < size * 10; i++) {
it.add(s);
}
}
}, new Tester("remove", 5000)
{
void test(List a)
{
ListIterator it = a.listIterator(3);
while (it.hasNext()) {
it.next();
it.remove();
}
}
},
};
public static void test(List a)
{
System.out.println("Testing " + a.getClass().getName());//輸出測試的類名稱
for (int i = 0; i < tests.length; i++) {
fill(a, tests[i].size);//填充空集合
System.out.print(tests[i].name);
long t1 = System.currentTimeMillis();
tests[i].test(a);//進行測試
long t2 = System.currentTimeMillis();
System.out.print(":" + (t2 - t1)+" ms ");
}
}
public static Collection fill(Collection c, int size)
{
for (int i = 0; i < size; i++) {
c.add(Integer.toString(i));
}
return c;
}
public static void main(String[] args)
{
test(new ArrayList());
System.out.println();
test(new LinkedList());
}
}

三、總結(jié)
首先,真的夸一下,這段代碼寫得真是好啊,無論是內(nèi)部類的應用還是對面向?qū)ο蟮恼J識,都考慮的恰到好處,哎,我什么時候才能寫出這么棒的代碼啊。
測試結(jié)果每次都有些許的差異,但不難得出以下的結(jié)論:
1、在 ArrayList 中進行隨機訪問(即 get())以及循環(huán)反復是最劃得來的 。原因在于,ArrayList是基于數(shù)組而來的,所以每個元素都有其對應的index,所以隨機定位一個元素要快捷的多。
2、在 LinkedList 中進行順序訪問、插入、刪除動作的話還是比較高效的。原因在于,插入、刪除的話對于LinkedList來說只需要改變其排列的一個node結(jié)點就可以了,而對于ArrayList來說刪除一個元素,需要不斷把后面的元素移到前面的位置上。
3、至于順序訪問,之前一直認為ArrayList 基于數(shù)組排列,在內(nèi)存中是連續(xù)排列的,應該會快得多,然后多次測試發(fā)現(xiàn)并不是想象的那樣,或者說ArrayList沒有表現(xiàn)出它該有的優(yōu)勢,甚至還不如LinkedList的訪問速度。原因在于:LinkedList 提供了優(yōu)化的順序訪問性能。
總結(jié)
以上所述是小編給大家介紹的ArrayList 和 LinkedList的執(zhí)行效率比較,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- JAVA LinkedList和ArrayList的使用及性能分析
- 淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系
- 對ArrayList和LinkedList底層實現(xiàn)原理詳解
- 分析Java中ArrayList與LinkedList列表結(jié)構(gòu)的源碼
- Java中ArrayList和LinkedList的遍歷與性能分析
- java 集合之實現(xiàn)類ArrayList和LinkedList的方法
- ArrayList和LinkedList區(qū)別及使用場景代碼解析
- java 中ArrayList與LinkedList性能比較
- Java中ArrayList和LinkedList之間的區(qū)別_動力節(jié)點Java學院整理
- Java中Array List與Linked List的實現(xiàn)分析
相關(guān)文章
SpringSecurity+Redis+Jwt實現(xiàn)用戶認證授權(quán)
SpringSecurity是一個強大且靈活的身份驗證和訪問控制框架,本文主要介紹了SpringSecurity+Redis+Jwt實現(xiàn)用戶認證授權(quán),具有一定的參考價值,感興趣的可以了解一下2024-07-07
如何解決@SpringBootApplication報錯問題
這篇文章主要介紹了如何解決@SpringBootApplication報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
spring boot的健康檢查HealthIndicators實戰(zhàn)
這篇文章主要介紹了spring boot的健康檢查HealthIndicators實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java 的雙重分發(fā)與 Visitor 模式實例詳解
這篇文章主要介紹了Java 的雙重分發(fā)與 Visitor 模式實例詳解,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07

