亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java中ArrayList 、LinkList的區別分析

2019-11-26 16:07:40
字體:
來源:轉載
供稿:網友

1.ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。
     2.對于隨機訪問get和set,ArrayList優于LinkedList,因為ArrayList可以隨機定位,而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時的查詢速度,看下面的程序:

復制代碼 代碼如下:

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<N;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<N;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。二分查找法使用的隨機訪問(randomaccess)策略,而LinkedList是不支持快速的隨機訪問的。對一個LinkedList做隨機訪問所消耗的時間與這個list的大小是成比例的。而相應的,在ArrayList中進行隨機訪問所消耗的時間是固定的。

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

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

復制代碼 代碼如下:

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<N;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中有一個私有的內部類,定義如下:

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在性能上各有優缺點,都有各自所適用的地方,總的說來可以描述如下:

性能總結:

- add()操作 delete()操作 insert操作 index取值操作 iterator取值操作
ArrayList/Vector/Stack極優 極優
LinkedList 極優

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

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

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

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

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

java中ArrayList 、List區別

List集合
    List繼承自Collection接口。List是一種有序集合,List中的元素可以根據索引(順序號:元素在集合中處于的位置信息)進行取得/刪除/插入操作。

    跟Set集合不同的是,List允許有重復元素。對于滿足e1.equals(e2)條件的e1與e2對象元素,可以同時存在于List集合中。當然,也有List的實現類不允許重復元素的存在。
   同時,List還提供一個listIterator()方法,返回一個ListIterator接口對象,和Iterator接口相比,ListIterator添加元素的添加,刪除,和設定等方法,還能向前或向后遍歷。

List跟Collection的關系:
java.util.Collection [I]
+--java.util.List [I]
   +--java.util.ArrayList [C]
   +--java.util.LinkedList [C]
   +--java.util.Vector [C]
      +--java.util.Stack [C]

List接口的實現類主要有ArrayList,LinkedList,Vector,Stack等。

父子關系.
   List是一個接口,ArrayList繼承與這個接口并實現了它.
   用的時候一般都用ArrayList.沒用過List. 可以這么用:List list = new ArrayList();

Collection接口
    Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,JavaSDK提供的類都是繼承自Collection的“子接口”如List和Set。
    所有實現Collection接口的類都必須提供兩個標準的構造函數:無參數的構造函數用于創建一個空的Collection,有一個Collection參數的構造函數用于創建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。后一個構造函數允許用戶復制一個Collection。

     如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:
    Iterator it = collection.iterator(); // 獲得一個迭代子
    while(it.hasNext()) {
                             Object obj = it.next(); // 得到下一個元素
       }
由Collection接口派生的兩個接口是List和Set。

    List接口:
    List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數組下標)來訪問List中的元素,這類似于Java的數組。
和下面要提到的Set不同,List允許有相同的元素。
除了具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator接口,和標準的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設定元素,還能向前或向后遍歷。
    實現List接口的常用類有LinkedList,ArrayList,Vector和Stack。

     LinkedList類
     LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
    注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:
List list = Collections.synchronizedList(new LinkedList(...));

ArrayList類
ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。
size,isEmpty,get,set方法運行時間為常數。但是add方法開銷為分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間為線性。
每個ArrayList實例都有一個容量(Capacity),即用于存儲元素的數組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。

總結
  如果涉及到堆棧,隊列等操作,應該考慮用List,對于需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。
      盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产限制| 精品毛片三在线观看| 日韩精品高清在线| 国产精品美女网站| 亚洲最大的免费| 日韩电影大全免费观看2023年上| 国产午夜精品麻豆| 狠狠久久五月精品中文字幕| 国产精品福利网| 久久久国产精品一区| 欧美激情视频在线免费观看 欧美视频免费一| 91精品久久久久久久久| 欧美性极品少妇精品网站| 亚洲第一精品久久忘忧草社区| 亚洲电影在线看| 91中文字幕一区| 亚洲第一在线视频| 91久久久久久久久久久| 国产精品福利在线观看| 伊是香蕉大人久久| www.日韩.com| 福利二区91精品bt7086| 日韩在线视频网| 亚洲国产成人av在线| 992tv成人免费影院| 日韩大片在线观看视频| 日韩高清有码在线| 成人网在线免费看| 国产综合色香蕉精品| 午夜精品一区二区三区在线播放| 亚洲欧美日韩图片| 日本成人黄色片| 国产亚洲精品久久久久久牛牛| 国产欧美在线视频| 亚洲国产日韩欧美在线动漫| 国产精品亚洲网站| 久久精品国产一区二区三区| 亚洲精品久久久久久久久久久久久| 日韩av大片免费看| 亚洲aa在线观看| 青青青国产精品一区二区| 91tv亚洲精品香蕉国产一区7ujn| 国产精品亚洲欧美导航| 亚洲人成啪啪网站| 国产精品6699| 琪琪第一精品导航| 欧美日韩亚洲网| 亚洲国产中文字幕在线观看| 97国产成人精品视频| 亚洲一区二区三区视频| 精品高清一区二区三区| 青青草一区二区| 欧美日韩国产限制| 久久人人爽亚洲精品天堂| 亚洲综合色av| 中文欧美在线视频| 成人激情视频免费在线| 成人免费网站在线| 欧美大全免费观看电视剧大泉洋| 久久99久久99精品中文字幕| 91久久久久久| 欧美怡红院视频一区二区三区| 精品调教chinesegay| 啪一啪鲁一鲁2019在线视频| 日韩黄色av网站| 欧美在线激情网| 97精品国产97久久久久久免费| 国产精品免费一区豆花| 久久亚洲欧美日韩精品专区| 欧美中文在线字幕| 国产欧美日韩视频| 欧美视频免费在线观看| 亚洲午夜精品视频| 国产丝袜一区视频在线观看| 久久久99久久精品女同性| 岛国视频午夜一区免费在线观看| 久久久久久久激情视频| 欧日韩在线观看| 日韩av毛片网| 国外成人在线播放| 亚洲欧美日韩高清| 国产精品久久久久久久久影视| 最新中文字幕亚洲| 久久久久久久电影一区| 亚洲女人天堂网| 欧美日韩国产麻豆| 热久久免费视频精品| 亚洲免费电影一区| 亚洲第一区中文字幕| 欧美人在线观看| 欧美精品免费播放| 欧美一区深夜视频| 欧美日韩亚洲激情| 九九九久久国产免费| 国产亚洲一级高清| 成人美女免费网站视频| 91精品久久久久久久久| 欧美日韩国产一区中文午夜| 欧美日韩亚洲一区二区三区| 欧美自拍大量在线观看| 欧美在线观看网址综合| 亚洲精品一区二区三区婷婷月| 亚洲精品国产精品国自产观看浪潮| 亚洲影视中文字幕| 5278欧美一区二区三区| 中文字幕在线国产精品| 亚洲精品视频在线播放| 国产精品美女午夜av| 亚洲片国产一区一级在线观看| 国产精品亚洲一区二区三区| 91av福利视频| 久久精品国产欧美亚洲人人爽| 国产精品极品尤物在线观看| 亚洲国产精品成人av| 亚洲国产欧美一区二区三区久久| 久久久久久亚洲精品| 北条麻妃一区二区在线观看| 亚洲人成亚洲人成在线观看| 久久人人爽人人爽人人片av高清| 亚洲免费人成在线视频观看| 欧美国产高跟鞋裸体秀xxxhd| 欧美人交a欧美精品| 亚洲免费成人av电影| 国产成人亚洲综合青青| 日韩暖暖在线视频| 中文字幕av一区二区三区谷原希美| 国产99视频精品免视看7| 久久99精品久久久久久噜噜| 国产精品jvid在线观看蜜臀| 欧美专区在线视频| 亚洲免费视频网站| 国产亚洲精品一区二555| 亚洲日韩中文字幕在线播放| 久久精品福利视频| 国产一区二区视频在线观看| 国产成人精品视频| 亚州av一区二区| 国产精品永久免费在线| 亚洲精品国产福利| 成人国产在线激情| 久久亚洲精品中文字幕冲田杏梨| 久久久www成人免费精品张筱雨| 国产国语videosex另类| 午夜精品久久久久久久99黑人| 日韩中文在线视频| 成人激情视频在线播放| 欧美成人免费全部观看天天性色| 国产精品视频中文字幕91| 国内精品视频在线| 精品日韩美女的视频高清| 91国语精品自产拍在线观看性色| 欧日韩在线观看| 久久久精品电影| 日韩在线视频一区| 欧美极品美女视频网站在线观看免费| 欧美日韩在线第一页| 国产日韩在线一区| 久久精品视频99| 久久精品国产精品亚洲| 在线观看日韩www视频免费| 国产精品视频在线播放| 国产精品成人v| 亚洲直播在线一区| 国产精品r级在线|