日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java arraylist和list_Java中ArrayList和LinkedList区别

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java arraylist和list_Java中ArrayList和LinkedList区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:http://pengcqu.iteye.com/blog/502676

一般大家都知道ArrayList和LinkedList的大致區別:

1.ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。 (LinkedList是雙向鏈表,有next也有previous)

2.對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。

3.對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。

ArrayList和LinkedList是兩個集合類,用于存儲一系列的對象引用(references)。例如我們可以用ArrayList來存儲一系列的String或者Integer。那么ArrayList和LinkedList在性能上有什么差別呢?什么時候應該用ArrayList什么時候又該用LinkedList呢?

一.時間復雜度

首先一點關鍵的是,ArrayList的內部實現是基于基礎的對象數組的,因此,它使用get方法訪問列表中的任意一個元素時(random access),它的速度要比LinkedList快。LinkedList中的get方法是按照順序從列表的一端開始檢查,直到另外一端。對LinkedList而言,訪問列表中的某個指定元素沒有更快的方法了。

假設我們有一個很大的列表,它里面的元素已經排好序了,這個列表可能是ArrayList類型的也可能是LinkedList類型的,現在我們對這個列表來進行二分查找(binary search),比較列表是ArrayList和LinkedList時的查詢速度,看下面的程序:

Java代碼??

package?com.mangocity.test;

import?java.util.LinkedList;

import?java.util.List;

import?java.util.Random;

import?java.util.ArrayList;

import?java.util.Arrays;

import?java.util.Collections;

public?class?TestList?...{

public?static?final?int?N=50000;

public?static?List?values;

static...{

Integer?vals[]=new?Integer[N];

Random?r=new?Random();

for(int?i=0,currval=0;i

vals=new?Integer(currval);

currval+=r.nextInt(100)+1;

}

values=Arrays.asList(vals);

}

static?long?timeList(List?lst)...{

long?start=System.currentTimeMillis();

for(int?i=0;i

int?index=Collections.binarySearch(lst,?values.get(i));

if(index!=i)

System.out.println("***錯誤***");

}

return?System.currentTimeMillis()-start;

}

public?static?void?main(String?args[])...{

System.out.println("ArrayList消耗時間:"+timeList(new?ArrayList(values)));

System.out.println("LinkedList消耗時間:"+timeList(new?LinkedList(values)));

}

}

我得到的輸出是:ArrayList消耗時間:15

LinkedList消耗時間:2596

這個結果不是固定的,但是基本上ArrayList的時間要明顯小于LinkedList的時間。因此在這種情況下不宜用LinkedList。二分查找法使用的隨機訪問(random access)策略,而LinkedList是不支持快速的隨機訪問的。對一個LinkedList做隨機訪問所消耗的時間與這個list的大小是成比例的。而相應的,在ArrayList中進行隨機訪問所消耗的時間是固定的。

這是否表明ArrayList總是比LinkedList性能要好呢?這并不一定,在某些情況下LinkedList的表現要優于ArrayList,有些算法在LinkedList中實現時效率更高。比方說,利用Collections.reverse方法對列表進行反轉時,其性能就要好些。

看這樣一個例子,加入我們有一個列表,要對其進行大量的插入和刪除操作,在這種情況下LinkedList就是一個較好的選擇。請看如下一個極端的例子,我們重復的在一個列表的開端插入一個元素:

Java代碼??

package?com.mangocity.test;

import?java.util.*;

public?class?ListDemo?{

static?final?int?N=50000;

static?long?timeList(List?list){

long?start=System.currentTimeMillis();

Object?o?=?new?Object();

for(int?i=0;i

list.add(0,?o);

return?System.currentTimeMillis()-start;

}

public?static?void?main(String[]?args)?{

System.out.println("ArrayList耗時:"+timeList(new?ArrayList()));

System.out.println("LinkedList耗時:"+timeList(new?LinkedList()));

}

}

這時我的輸出結果是:ArrayList耗時:2463

LinkedList耗時:15

這和前面一個例子的結果截然相反,當一個元素被加到ArrayList的最開端時,所有已經存在的元素都會后移,這就意味著數據移動和復制上的開銷。相反的,將一個元素加到LinkedList的最開端只是簡單的未這個元素分配一個記錄,然后調整兩個連接。在LinkedList的開端增加一個元素的開銷是固定的,而在ArrayList的開端增加一個元素的開銷是與ArrayList的大小成比例的。

二.空間復雜度

在LinkedList中有一個私有的內部類,定義如下:

Java代碼??

private?static?class?Entry?{

Object?element;

Entry?next;

Entry?previous;

}

每個Entry對象reference列表中的一個元素,同時還有在LinkedList中它的上一個元素和下一個元素。一個有1000個元素的LinkedList對象將有1000個鏈接在一起的Entry對象,每個對象都對應于列表中的一個元素。這樣的話,在一個LinkedList結構中將有一個很大的空間開銷,因為它要存儲這1000個Entity對象的相關信息。

ArrayList使用一個內置的數組來存儲元素,這個數組的起始容量是10.當數組需要增長時,新的容量按如下公式獲得:新容量=(舊容量*3)/2+1,也就是說每一次容量大概會增長50%。這就意味著,如果你有一個包含大量元素的ArrayList對象,那么最終將有很大的空間會被浪費掉,這個浪費是由ArrayList的工作方式本身造成的。如果沒有足夠的空間來存放新的元素,數組將不得不被重新進行分配以便能夠增加新的元素。對數組進行重新分配,將會導致性能急劇下降。如果我們知道一個ArrayList將會有多少個元素,我們可以通過構造方法來指定容量。我們還可以通過trimToSize方法在ArrayList分配完畢之后去掉浪費掉的空間。

三.總結

ArrayList和LinkedList在性能上各有優缺點,都有各自所適用的地方,總的說來可以描述如下:

1.對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。

2.在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。

3.LinkedList不支持高效的隨機元素訪問。

4.ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間

可以這樣說:當操作是在一列數據的后面添加數據而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列數據的前面或中間添加或刪除數據,并且按照順序訪問其中的元素時,就應該使用LinkedList了。

總結

以上是生活随笔為你收集整理的java arraylist和list_Java中ArrayList和LinkedList区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。