1. 程式人生 > >陣列、List和ArrayList的區別

陣列、List和ArrayList的區別

  有些知識點可能平時一直在使用,不過實際開發中我們可能只是知其然不知其所以然,所以經常的總結會對我們的提高和進步有很大的幫助,這裡記錄自己在工作之餘的問題,持續更新,歡迎高手斧正.

  陣列、List和ArrayList的區別

陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元素也很簡單,比如:

string[] s=new string[3];
//賦值
 s[0]="a"; s[1]="b"; s[2]="c";
//修改
 s[1]="b1";

  但是陣列也存在一些不足的地方。比如在陣列的兩個資料間插入資料也是很麻煩的,還有我們在宣告陣列的時候,必須同時指明陣列的長度,陣列的長度過長,會造成記憶體浪費,陣列和長度過短,會造成資料溢位的錯誤。這樣如果在宣告陣列時我們並不清楚陣列的長度,就變的很麻煩了。C#中最先提供了ArrayList物件來克服這些缺點。

  ArrayList是.Net Framework提供的用於資料儲存和檢索的專用類,它是名稱空間System.Collections下的一部分。它的大小是按照其中儲存的資料來動態擴充與收縮的。所以,我們在宣告ArrayList物件時並不需要指定它的長度。ArrayList繼承了IList介面,所以它可以很方便的進行資料的新增,插入和移除.比如:

ArrayList list = new ArrayList();
//新增資料
 list.Add("abc"); list.Add(123);
//修改資料
 list[2] = 345;
//移除資料
 list.RemoveAt(0);
//插入資料 list.Insert(0, "hello world");

  從上面示例看,ArrayList好像是解決了陣列中所有的缺點,那麼它應該就是完美的了,為什麼在C#2.0後又會出現List呢?

  在list中,我們不僅插入了字串"abc",而且又插入了數字123。這樣在ArrayList中插入不同型別的資料是允許的。因為ArrayList會把所有插入其中的資料都當作為object型別來處理。這樣,在我們使用ArrayList中的資料來處理問題的時候,很可能會報型別不匹配的錯誤,也就是說ArrayList不是型別安全的。既使我們保證在插入資料的時候都很小心,都有插入了同一型別的資料,但在使用的時候,我們也需要將它們轉化為對應的原型別來處理。這就存在了裝箱與拆箱的操作,會帶來很大的效能損耗。

  裝箱與拆箱的概念: 簡單的來講: 裝箱:就是將值型別的資料打包到引用型別的例項中 比如將int型別的值123賦給object物件o

                    int i=123; object o=(object)i;

                  拆箱:就是從引用資料中提取值型別 比如將object物件o的值賦給int型別的變數i

                    object o=123; int i=(int)o;

           裝箱與拆箱的過程是很損耗效能的。

  正是因為ArrayList存在不安全型別與裝箱拆箱的缺點,所以在C#2.0後出現了泛型的概念。而List類是ArrayList類的泛型等效類。它的大部分用法都與ArrayList相似,因為List類也繼承了IList介面。最關鍵的區別在於,在宣告List集合時,我們同時需要為其宣告List集合內資料的物件型別。 比如:

List<int> list = new List<int>();
//新增資料
 list.Add(123);
//修改資料 
list[0] = 345;
//移除資料
list.RemoveAt(0);

  上例中,如果我們往List集合中插入string字元"hello world",IDE就會報錯,且不能通過編譯。這樣就避免了前面講的型別安全問題與裝箱拆箱的效能問題了。

  同時 List不能被構造,但可以向上面那樣為List建立一個引用,而ListArray就可以被構造。 

List list;     //正確   list=null; 
List list=new List();    //   是錯誤的用法

  List list = new ArrayList();這句建立了一個ArrayList的物件後把上溯到了List。此時它是一個List物件了,有些ArrayList有但是List沒有的屬性和方法,它就不能再用了。 而ArrayList list=new ArrayList();建立一物件則保留了ArrayList的所有屬性。 

  List泛型的好處: 
  通過允許指定泛型類或方法操作的特定型別,泛型功能將型別安全的任務從您轉移給了編譯器。不需要編寫程式碼來檢測資料型別是否正確,因為會在編譯時強制使用正確的資料型別。減少了型別強制轉換的需要和執行時錯誤的可能性。泛型提供了型別安全但沒有增加多個實現的開銷。

相關推薦

陣列ListArrayList區別

  有些知識點可能平時一直在使用,不過實際開發中我們可能只是知其然不知其所以然,所以經常的總結會對我們的提高和進步有很大的幫助,這裡記錄自己在工作之餘的問題,持續更新,歡迎高手斧正.   陣列、List和ArrayList的區別 陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元素也

C#陣列ListArrayList區別

 有些知識點可能平時一直在使用,不過實際開發中我們可能只是知其然不知其所以然,所以經常的總結會對我們的提高和進步有很大的幫助,這裡記錄自己在工作之餘的問題,持續更新,歡迎高手斧正. 【陣列】  陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元素也很簡

ArrayListArrayList區別

Array 定義:  public abstract class Array:ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuraEquatable     陣列在

Ognl訪問陣列ListMap

陣列 package com.xs; import ognl.Ognl; import ognl.OgnlContext; import ognl.OgnlException; public class OgnlAarray { /** * @param ar

陣列listarraylist三者的區別

原地址(http://www.cnblogs.com/a164266729/p/4561651.html) 陣列、List和ArrayList的區別   陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元素也很簡單,比如: string[] s=new string

ListMapSet的理解(LinkedListArrayListVectorArrayListHashMapHashTableHashSet區別與使用)

List特點:元素有放入順序,元素可重複 Map特點:元素按鍵值對儲存,無放入順序 Set特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的) List介面有三

JAVA中 ListArrayList區別

屬性和方法 vector 實現類 多個 一個 什麽 性能 {} 等等 List是一個接口,而ListArray是一個類。 ListArray繼承並實現了List。 所以List不能被構造,但可以向上面那樣為List創建一個引用,而ListArray就可以被構造。 Li

C++ vectorlistdeque的區別 (整理)

style stl 內存大小 splice cnblogs 類定義 所有 編寫 重復 1.vector數據結構  vector和數組類似,擁有一段連續的內存空間,並且起始地址不變。因此能高效的進行隨機存取,時間復雜度為o(1);但因為內存空間是連續的,所以在進行插入和刪除操

陣列vectorarray的區別

模板類vector和array都是陣列的替代品 1.vector: vector<typeName> vt<n_elem>; 其中引數可以是n_elem可以使hi整形常量,也是是整形變數。 可以在執行階段的時候設定vector的長度,使用new和dele

SetListMap的區別

Set、List和Map是java容器框架的三個最重要的介面。 List提供了一個有序且有索引的容器,它允許重複值的出現。 Set提供了一個無序的唯一物件的容器,也就是說Set不允許重複值。 Map提供了一個基於鍵值對以及雜湊的資料結構。 容器API裡都

ListArrayList, MapHashMap的區別

List是介面,List特性就是有序,會確保以一定的順序儲存元素. ArrayList是它的實現類,是一個用陣列實現的List. Map是介面,Map特性就是根據一個物件查詢物件. HashMap是它的實現類,HashMap用hash表實現的Map,就是利用物件的hashcode(hashcod

Java中ListArrayList區別(加入了個人見解)

       轉載自:http://www.cnblogs.com/aisiteru/articles/1151874.html       第一次看這篇文章時,是在CSDN部落格中看到的,作者寫的初衷還是蠻好的,但是確實有錯誤的地方和不是很明白的地方。於是就很想去看看原文,

ArrayListLinkedListVector區別

最近刷面試題,做個隨筆。。。查資料看見下面這圖不錯就偷來了。 一、區別 如圖,三個實現了Java.util.List介面。 Vector和ArrayList底層都是Object[]儲存的

List ArrayList區別

關於List和ArrayList、List<String> list = new ArrayList<String>();   List是一個介面,是Collection介面的一個子介面,是一個有序的集合。 ArrayList是List的一個實現類,

Java中把物件物件beanlist集合物件陣列MapSet以及字串轉換成Json

把Java對常用的一些資料轉換成Json,以便前臺的呼叫. 物件轉換為Json public class ConvertJson { /** * 物件轉換為Json * @param obj * @

ListArrayList區別

List是一個介面,而ListArray是一個類。 ListArray繼承並實現了List。 所以List不能被構造,但可以向上面那樣為List建立一個引用,而ListArray就可以被構造。 List list;     //正確   list=null; List list=new List();   

java beanList陣列mapJson的相互轉化

package com.my.json; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.J

Java中ListArrayList區別

List是一個介面,而ListArray是一個類。  ListArray繼承並實現了List。  所以List不能被構造,但可以向上面那樣為List建立一個引用,而ListArray就可以被構造。  List list;     //正確   list=null;  Lis

List ArrayList區別

difference betwee List and ArrayList:List: 兼有陣列和ArrayList的功能;   給定資料型別,可以新增以及刪除插入; 不用裝箱拆箱:給定明確的資料型別;擁有arraylist 和陣列的功能 List<string>

2.請介紹一下ListArrayList區別ArrayListHashSet區別

引用 equal ash arraylist 無序 lis 檢索 重復 lec 第一問:   List是接口,ArrayList實現了List接口。 第二問:   ArrayList實現了List接口,HashSet實現了Set接口,List和Set都是繼承Colle