『壹』 數組和List<>有什麼區別
Array和List都屬於順序表。
Array是一段連續的存儲結構
int[] i=new int[3]
i其實記錄的是數組的首地址,而i[1]其實相當於在i的地址的基礎上加上1個整數的地址偏移,然後再取這塊地址中的值。
List則是不連續的存儲結構,List的每個節點都有著一個Next屬性,這個屬性則記錄著他的下一個節點的地址。
也就是說當我們想找第100個節點的時候,他還是需要從第一個節點,然後做99次Next操作,才能找到list[99]節點。
在查找一個元素時時分別生成以下IL碼
Array:
IL_0020: ldloc.0
IL_0021: ldc.i4.3
IL_0022: ldelem.i4
IL_0023: stloc.2
List:
IL_0022: ldloc.0
IL_0023: ldc.i4.3
IL_0024: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<int32>::get_Item(int32)
IL_0029: stloc.2
通過這兩段IL,我只是希望證明List和Array對索引元素的方式是不同的。當然,我們無從知道Microsoft對List方法get_Item的實現。但是我們不難想像:
因為List是一個鏈表,所以我需要從第一個元素開始逐個Next到所需索引的元素。這是一個耗時的過程。
1. 從空間擴展角度上來說:
數組必須要在初始化時分配固定的大小,比如說int[] a=new int[3];如果我們僅僅寫int[] a=new int[];編譯器就會無情地給我們報錯。但是List由於空間不必連續,所以無須指定初始大小。
總結1: 當不確定大小時,最好使用List代替Array。
2. 從操作角度上來看:
關於索引這個就不贅述了。
總結2:當需要大量的查找操作時,最好使用Array。
對於插入(刪除)操作,很多人是從插入(刪除)的時間上分析,說List優於Array,我覺得是不合理的。
更合理的解釋應該是從兩個角度分析(以插入為例):
<1> 指定位置插入指定元素:
對於Array講,有兩套解決方案:
A. 使用一個新數組,N+1個元素重新賦值的過程。一個for循環,時間復雜度O(n)。
B. 在原數組上操作,那麼首先需要為該數組預留空間,這是個很難辦的事情。而且其後續元素的移動耗費時間復雜度仍未O(n)。
對於List來講,很多人說復雜度就是O(1)。這其實是不合理的,因為List插入元素固然容易,但是在指定位置的插入,需要一個時間復雜度為O(n)的查找過程。
但是只考慮時間復雜度是不夠的,我們要考慮總體的情況。如果使用新數組,不僅浪費了新的空間,而且需要反復的賦值過程,是N+1次。如果不使用新數組,預留空間實在太麻煩,因此綜上所述,還是List好。
<2> 給出前一個節點,然後在後面插入元素。這個我的意思就是不僅僅給出了PreviousNode的Value,還給出了他的Next。這個情況我就不廢話了,List的優勢太大了。可是在實際情況中,這種情況的可能性幾乎為零。
因此,總結3:當需要進行頻繁的插入,刪除操作時,最好使用List代替Array。
另外,給出個不太重要的補充,由於List需要存儲他下一個節點的地址,所以List比Array相對起來浪費了更多的空間。
也就是說雖然使用list<T>強類型範性,能夠節約裝箱拆箱時間,但查詢速度會有很多問題。
在實際使用中,對變化不大,查詢次數頻繁的,我們應該考慮list<T>外的情況
當然,就查詢某個值的速度而言,還是 Hashtable 或 Dictionary 最快,當然這兩者和我們在討論的東西,結構完全不相同,沒有可比性。畢竟數組,是節約空間,而hash表是散列的,犧牲空間來換取速度
『貳』 java list和數組的區別
List和ArrayList的區別在於:
1、在編程語言中ArrayList類是.Net Framework提供的用於數據存儲和檢索的專用類。List 類可以簡單視之為雙向連結串列,以線性列的方式管理物件集合。List類是ArrayList類的泛型等效類。
2、ArrayList繼承了IList介面,所以它可以很方便的進行數據的添加,插入和移除。List的大部分用法都與ArrayList相似,List類也繼承了IList介面。
3、在ArrayList中可以插入不同類型的數據。ArrayList會把所有插入其中的數據都當作為object類型來處理,這其中存在裝箱與拆箱的操作,會對系統造成性能上的損耗。而List需要聲明其數據的對象類型。聲明後插入其他類型數據,IDE就會報錯,且不能通過編譯。
(2)前端傳數組和list有什麼區別擴展閱讀:
一、List泛型
通過允許指定泛型類或方法操作的特定類型,泛型功能將類型安全的任務從程序員轉移給了編譯器。不需要編寫代碼來檢測數據類型是否正確,因為會在編譯時強制使用正確的數據類型。減少了類型強制轉換的需要和運行時錯誤的可能性。泛型提供了類型安全但沒有增加多個實現的開銷。
二、裝箱與拆箱的概念:
1、裝箱:就是將值類型的數據打包到引用類型的實例中 比如將int類型的值123賦給object對象o
int i=123; object o=(object)i;
2、拆箱:就是從引用數據中提取值類型 比如將object對象o的值賦給int類型的變數i
object o=123; int i=(int)o;
3、裝箱與拆箱的過程是很損耗性能的。
『叄』 C#中數組,ArrayList和List三者的區別
數組和List很常用。。。ArrayList會嚴重損耗性能,除非無法避免,否則能不用就別用。。
三者之中,數組的性能是最好的,但數組必須在聲明的時候確定長度。。。一旦聲明之後,長度就無法改變。。而實際開發中總有一些情況,讓我們必須改變長度。。。所以才有ArrayList和List。。
ArrayList就像JAVASCRIPT里的數組一樣,不需要考慮變數類型,所有類型都可以無腦裝進來。。。。其實就是無論什麼類型,都在裝入的時候,被自動轉換成了Object類型。。由於object是一切類型的父類,所以ArrayList裡面什麼都能裝。。看起來似乎挺省事,但其實缺點非常嚴重。。它會讓C#靜態語言的性能優勢消失。。性能直接下降幾十倍。。變得與JS等動態語言一樣慢。。其實關鍵就是在於,每一次轉換之間,都必須產生裝箱和拆箱。。。這就是為什麼JS,PYTHON,RUBY等語言,所開發出的程序執行效率都非常差的原因。。
List是泛型集合,這里涉及到泛型的概念,篇幅有限,無法說明,如果你學習了泛型,自然就會明白它的原理。。。總之List集合是個很棒的東西。。既不像ArrayList那樣嚴重損失性能,又不像數組一樣在定義時就限制了長度。。
一個最合理的原則。。。能用數組解決的問題,優先使用數組。。。數組無法滿足的,就用List集合。。。不到萬不得已,永遠不要用ArrayList。。。
『肆』 C#中數組,ArrayList和List三者的區別
1、相同點:
Array,ArrayList,List都是從IList派生出來的,它們都實現了IEnumerable介面。
2、不同點:
Array是抽象類不能被實例化,所有數組的定義都從它派生而來。
ArrayList是動態數組,可以自由伸縮數組的大小。實質上Array抽象類也提供了Resize方法動態改變數組的大小。
List是集合類型,並且是一個支持泛型的集合類型。
『伍』 java中隊列,數組和list集合的區別
數組是JAVA語言內置的數據類型,它是一個線性的序列,所以它可以快速的訪問其他的元素。但是速度是要有代價的,當你創建了一個數組之後,它的容量就固定了,而且在其生命周期里是不能改變的。還有一點,JAVA裡面的數組是會做邊界檢查的,所以當你越界訪問時,會拋出RuntimeException,所以不用擔心在C或C++因為不做邊界檢查而出現的問題了,當然邊界檢查是以犧牲效率為代價的。數組與其它容器類的區別體現在三個方面:效率、類型識別和可以持有primitives。 JAVA裡面提供的其他容器還包括List,Set和Map。他們處理對象的時候就好像這些這些對象都沒有自己的類型一樣,容器將它所含的元素都看成是JAVA中所有類的根類Object類型的,這樣我們只需創建一種容器,就能把所有的類型的對象全部放進去。但是當取出的時候,那就需要我們自己進行類型轉換了,不過在JAVA Tiger版裡面新引入了「泛型」的概念,結合容器類一起使用就可以解決類型轉換的問題,關於「泛型」這就不詳細講解了。從上面的角度來看,這種做法很不錯,但是就是苦了primitives,如果是常量的話,可以把primitive轉換成wrapper類然後放進容器裡面,如果是變數的話,那就只能放在你自己的類里了。與其他容器類相比,數組會在編譯的時候作類型檢查,從而防止你插入錯誤類型的對象,或者在提取對象的時候把對象的類型給搞錯了,JAVA在編譯和運行的時候都能阻止你將一個不恰當的消息傳給對象。至於效率,數組無疑是要高於其他容器類的,因為有些容器類的實現就是基於數組的,比如ArrayList。不論從類型檢查還是效率的角度來考慮,我們首選數組來作為容器都是沒錯的,但是數組的缺點就是功能太弱了,所以才會有容器類的出現。 要多說幾句的就是,java.util包裡面有一個Arrays類,它包括了一組可以用於數組的static的工具方法,其中最基本的是四個方法:用來比較兩個數組是否相等的equals();用來填充數組的fill();用來對數組進行排序的sort();以及用於在一個已經排序的數組中查找元素的binarySearch()。所有這些方法都對primitives和Object進行了重載。此外還有一個asList()方法,它接受一個數組,然後把它轉成一個List容器。JAVA標准類庫還提供了一個System.array()的靜態方法,它能以較快的速度拷貝數組,對primitive和Object都進行了重載,但是注意當對Object數組進行拷貝時,進行的是淺拷貝(shallow )
『陸』 C#中數組,ArrayList和List三者的區別
ArrayList (using System.Collections)
1、通過添加和刪除元素就可以動態改變數組的長度。但跟一般的數組比起來,速度慢些。
2、ArrayList中的所有元素都是 對象 的引用(如:ArrayList中的Add()方法定義為public virtual int Add( object value);)
3、ArrayList的索引會自動分配和調整
實例用法:
ArrayList aList = new ArrayList();
aList.Add("add1"); //將對象添加到尾處:添加後的結果;aList[0] = "add1"
aList.Add("add2");//添加後的結果:aList[0] = "add1",aList[1] ="add2"
aList.Insert(0,"insert1"); //將元素插入指定索引處(插入後的結果:aList[0] ="insert1",aList[1]="add1",aList[2]="add2")
ArrayList aList2 = new ArrayList();
aList2.Add("add3");
aList2.Add("add4");
aList.InsertRange(1,aList2); //插入後結果aList[0]="insert1",aList[1]="add3",aList[2]="add4",aList[3]="add1",aList[4]="add2"
aList.Remove("add3");//移除特定對象的 第一個 匹配項。移除結果:aList[0]="insert1",aList[1]="add4",aList[2]="add1",aList[3]="add2"
aList.RemoveAt(0); //移除指定 索引 處的元素。移除結果:aList[0]="add4",aList[1]="add1",aList[2]="add2"
aList.Add("add5");
aList.RemoveRange(1,2);//移除一定范圍的元素。1:表示索引;2:表示從索引處開始的數目。移除後結果:aList[0]="add4",aList[1]="add5"
aList.Clear();//移除aList中的 所有 元素