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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析

發(fā)布時間:2023/12/31 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:小許子

https://www.cnblogs.com/xiaoXuZhi/p/XYH_dataStructureTest_array.html

一、前言:

  在c#數(shù)據(jù)結(jié)構(gòu)中,集合的應(yīng)用非常廣泛,無論是做BS架構(gòu)還是CS架構(gòu)開發(fā),都離不開集合的使用,比如我們常見的集合包括:Array、ArrayList、List、LinkedList等。這一些數(shù)據(jù)集合,在功能上都能夠?qū)崿F(xiàn)集合的存取,但是他們內(nèi)部有什么區(qū)別,在使用時需要注意一些什么呢?下面根據(jù)個人的經(jīng)驗,對這一些集合數(shù)據(jù)的使用做一個簡單的小結(jié),如果說的不對的地方,歡迎指出,多多交流改進。

二、Array集合簡介

  Array集合,也就是數(shù)組,是最簡單的數(shù)據(jù)結(jié)構(gòu),其存儲的數(shù)據(jù)在內(nèi)存空間是連續(xù)的,數(shù)組有一下一些特點

  • 1.數(shù)據(jù)存儲是連續(xù)的

  • 2.數(shù)組長度在定義時就必須制定

  • 3.數(shù)組存儲的數(shù)據(jù)類型都是同一類型

  • 4.數(shù)組可以直接通過小標訪問

  優(yōu)缺點: ? 優(yōu)點:  1、可以根據(jù)索引直接訪問,訪問速度快 ? 2、數(shù)據(jù)是安全的,由于數(shù)據(jù)類型一致性,在存儲使用過程中不涉及  缺點:  1、由于數(shù)據(jù)是連續(xù)存儲的,導(dǎo)致插入效率變慢 ? ?2、由于數(shù)組長度大小固定,那么對預(yù)期非固定長度的數(shù)字不好處理

  練習(xí)實例代碼:

/// /// 數(shù)組練習(xí)操作 /// public class ArrayTest { /// 數(shù)組 Array 對于大家來說一點都不陌生 /// 數(shù)組是在內(nèi)存連續(xù)分配的存儲空間,這也導(dǎo)致數(shù)組有一下一些特點 /// 1.數(shù)據(jù)存儲是連續(xù)的 /// 2.數(shù)組長度在定義時就必須制定 /// 3.數(shù)組存儲的數(shù)據(jù)類型都是同一類型 /// 4.數(shù)組可以直接通過小標訪問 /// /// 優(yōu)缺點: /// 優(yōu)點: /// 1、可以根據(jù)索引直接訪問,訪問速度快 /// 2、數(shù)據(jù)是安全的,由于數(shù)據(jù)類型一致性,在存儲使用過程中不涉及到裝箱拆箱操作 /// 缺點: /// 1、由于數(shù)據(jù)是連續(xù)存儲的,導(dǎo)致插入效率變慢 /// 2、由于數(shù)組長度大小固定,那么對預(yù)期非固定長度的數(shù)字不好處理 /// int類型的數(shù)組操作 public static void IntArrayTest() { //// 定義一個秒表,執(zhí)行獲取執(zhí)行時間 Stopwatch st = new Stopwatch();//實例化類 st.Start();//開始計時 Console.WriteLine("開始初始化長度為10000000的int數(shù)組:"); //// 定義一個數(shù)組 int[] nums = new int[10000000]; for (int i = 0; i < 10000000; i++) { nums[i] = 1 + 1; } //需要統(tǒng)計時間的代碼段 st.Stop();//終止計時 Console.WriteLine(string.Format("初始化長度為10000的int數(shù)組完畢!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString())); } }

三、ArrayList集合簡介

ArrayList 是Array的升級版,能夠解決Array的一些缺點ArrayList其內(nèi)部實現(xiàn)也是Array,只是其長度是可以動態(tài),在其內(nèi)部用一個變量記錄控制長度,ArrayList有如下一些特點

  • 1.長度不固定

  • 2.可以存儲不同的數(shù)據(jù)類型(object)

  • 3.同樣支持索引查詢(可以直接通過小標訪問)

  • 4.靈活性更強,以犧牲性能為代價

優(yōu)缺點:優(yōu)點:1、長度不固定,在定義是不必擔長度溢出2、可以存儲任意數(shù)據(jù)類型3、可根據(jù)索引查詢,查詢效率快缺點:1、由于長度不固定,執(zhí)行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數(shù)據(jù),犧牲性能2、由于存儲類型是object,所以在存數(shù)據(jù)時會有裝箱操作,在取數(shù)據(jù)時會有拆箱操作,影響效率3、線程不安全,因為其內(nèi)部實現(xiàn)是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程使用技巧:在實際使用過程中,為了避免自動擴容,可以預(yù)估數(shù)據(jù)長度,初始化一個數(shù)據(jù)長度,從而提高效率

練習(xí)實例代碼:

/// /// ArrayList數(shù)組練習(xí)操作 /// public class ArrayListTest { /// ArrayList 是Array的升級版,能夠解決Array的一些缺點 /// ArrayList其內(nèi)部實現(xiàn)也是Array,只是其長度是可以動態(tài),在其內(nèi)部用一個變量記錄控制長度,ArrayList有如下一些特點 /// 1.長度不固定 /// 2.可以存儲不同的數(shù)據(jù)類型(object) /// 3.同樣支持索引查詢(可以直接通過小標訪問) /// 4.靈活性更強,以犧牲性能為代價 /// 優(yōu)缺點: /// 優(yōu)點: /// 1、長度不固定,在定義是不必擔長度溢出 /// 2、可以存儲任意數(shù)據(jù)類型 /// 3、可根據(jù)索引查詢,查詢效率快 /// 缺點: /// 1、由于長度不固定,執(zhí)行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數(shù)據(jù),犧牲性能 /// 2、由于存儲類型是object,所以在存數(shù)據(jù)時會有裝箱操作,在取數(shù)據(jù)時會有拆箱操作,影響效率 /// 3、線程不安全,因為其內(nèi)部實現(xiàn)是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程 /// /// 使用技巧: /// 在實際使用過程中,為了避免自動擴容,可以預(yù)估數(shù)據(jù)長度,初始化一個數(shù)據(jù)長度,從而提高效率 /// ArrayList操作實例 public static void ArrayListOpert() { //// 定義一個秒表,執(zhí)行獲取執(zhí)行時間 Stopwatch st = new Stopwatch();//實例化類 //// 需要統(tǒng)計時間的代碼段(統(tǒng)計初始化長度時的執(zhí)行時間) st.Start();//開始計時 Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("ArryList集合存儲數(shù)據(jù)量為10000000,初始化一個長度,執(zhí)行開始:"); ArrayList arrayList = new ArrayList(10000000); //// 定義一個數(shù)組 for (int i = 0; i < 10000000; i++) { arrayList.Add(1 + 1); } st.Stop();//終止計時 Console.WriteLine(string.Format("ArryList集合存儲數(shù)據(jù)量為10000000,初始化一個長度,執(zhí)行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString())); //// 需要統(tǒng)計時間的代碼段(統(tǒng)計初始化非指定長度時的執(zhí)行時間) st.Restart(); Console.WriteLine(""); Console.WriteLine("ArryList集合存儲數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行開始:"); arrayList = new ArrayList(); //// 定義一個數(shù)組 for (int i = 0; i < 10000000; i++) { arrayList.Add(1 + 1); } st.Stop();//終止計時 Console.WriteLine(string.Format("ArryList集合存儲數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString())); } }

四、List集合簡介

隨著c#泛型的推出,為了避免ArrayList一些缺點,微軟推出了List集合List集合內(nèi)部還是采用的Array實現(xiàn),同時在定義時需要指定對應(yīng)的數(shù)據(jù)類型這樣級保留了Array集合的優(yōu)點,同時也避免了ArrayList集合的數(shù)據(jù)類型不安全和裝箱帶來的性能犧牲List特點:

  • 1、數(shù)據(jù)長度不固定,自動增加

  • 2、存儲相同的數(shù)據(jù)類型

  • 3、可根據(jù)索引查詢,查詢效率快

優(yōu)缺點:優(yōu)點:1、長度不固定,在定義是不必擔長度溢出2、存儲相同數(shù)據(jù)類型的數(shù)據(jù),避免的數(shù)據(jù)的裝箱拆箱,提高了數(shù)據(jù)處理效率3、支持索引查詢,查詢效率快缺點:1、由于長度不固定,執(zhí)行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數(shù)據(jù),犧牲性能2、線程不安全,因為其內(nèi)部實現(xiàn)是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程

練習(xí)實例代碼:

/// /// List練習(xí)操作 /// public class ListTest { /// 隨著c#泛型的推出,為了避免ArrayList一些缺點,微軟推出了List集合 /// List集合內(nèi)部還是采用的Array實現(xiàn),同時在定義時需要指定對應(yīng)的數(shù)據(jù)類型 /// 這樣級保留了Array集合的優(yōu)點,同時也避免了ArrayList集合的數(shù)據(jù)類型不安全和裝箱帶來的性能犧牲 /// List特點: /// 1、數(shù)據(jù)長度不固定,自動增加 /// 2、存儲相同的數(shù)據(jù)類型 /// 3、可根據(jù)索引查詢,查詢效率快 /// /// 優(yōu)缺點: /// 優(yōu)點: /// 1、長度不固定,在定義是不必擔長度溢出 /// 2、存儲相同數(shù)據(jù)類型的數(shù)據(jù),避免的數(shù)據(jù)的裝箱拆箱,提高了數(shù)據(jù)處理效率 /// 3、支持索引查詢,查詢效率快 /// 缺點: /// 1、由于長度不固定,執(zhí)行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數(shù)據(jù),犧牲性能 /// 2、線程不安全,因為其內(nèi)部實現(xiàn)是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程 /// ArrayList操作實例 public static void ListOpert(){ 定義一個秒表,執(zhí)行獲取執(zhí)行時間 Stopwatch st = new Stopwatch();//實例化類 st.Start();//開始計時 需要統(tǒng)計時間的代碼段(統(tǒng)計初始化長度時的執(zhí)行時間) Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("List集合存儲數(shù)據(jù)量為10000000,初始化一個長度,執(zhí)行開始:"); List<int> list = new List<int>(10000000); 定義一個數(shù)組 for (int i = 0; i < 10000000; i++) { list.Add(1 + 1); } //需要統(tǒng)計時間的代碼段 st.Stop();//終止計時 Console.WriteLine(string.Format("List集合存儲數(shù)據(jù)量為10000000,初始化一個長度,執(zhí)行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString())); 需要統(tǒng)計時間的代碼段(統(tǒng)計初始化非指定長度時的執(zhí)行時間) st.Restart(); Console.WriteLine(""); Console.WriteLine("List集合存儲數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行開始:"); list = new List<int>(); 定義一個數(shù)組 for (int i = 0; i < 10000000; i++) { list.Add(1 + 1); } st.Stop();//終止計時 Console.WriteLine(string.Format("List集合存儲數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString())); } }

五、LinkedList集合簡介

LinkedList鏈表的底層是采用雙向鏈表的方式實現(xiàn),在鏈表(Linked List)中,每一個元素都指向下一個元素,以此來形成了一個鏈(chain)可以從頭部和尾部插入數(shù)據(jù),在存儲內(nèi)存上采用非連續(xù)方式存儲,鏈表有如下一些特點

  • 1、內(nèi)存存儲上是非連續(xù)的

  • 2、能夠支持從頭部和底部同時插入

  • 3、長度是非固定的

優(yōu)缺點:優(yōu)點:1、由于非連續(xù)存儲,中部插入和刪除元素效率高2、長度非固定,在創(chuàng)建時不用考慮其長度3、可以沖頭部和底部添加元素4、數(shù)據(jù)類型是安全的,在創(chuàng)建時需要指定的數(shù)據(jù)類型缺點:1、由于非連續(xù)存儲,不能通過小標訪問,查詢效率低

練習(xí)實例代碼:

/// /// LinkedList練習(xí)操作 /// public class LinkedListTest { /// LinkedList鏈表的底層是采用雙向鏈表的方式實現(xiàn), /// 在鏈表(Linked List)中,每一個元素都指向下一個元素,以此來形成了一個鏈(chain) /// 可以從頭部和尾部插入數(shù)據(jù),在存儲內(nèi)存上采用非連續(xù)方式存儲,鏈表有如下一些特點 /// 1、內(nèi)存存儲上是非連續(xù)的 /// 2、能夠支持從頭部和底部同時插入 /// 3、長度是非固定的 /// 優(yōu)缺點: /// 優(yōu)點: /// 1、由于非連續(xù)存儲,中部插入和刪除元素效率高 /// 2、長度非固定,在創(chuàng)建時不用考慮其長度 /// 3、可以沖頭部和底部添加元素 /// 4、數(shù)據(jù)類型是安全的,在創(chuàng)建時需要指定的數(shù)據(jù)類型 /// 缺點: /// 1、由于非連續(xù)存儲,不能通過小標訪問,查詢效率低 /// LinkedList操作實例 public static void LinkedListTestOpert() { //// 定義一個秒表,執(zhí)行獲取執(zhí)行時間 Stopwatch st = new Stopwatch();//實例化類 st.Start();//開始計時 //// 需要統(tǒng)計時間的代碼段(統(tǒng)計初始化長度時的執(zhí)行時間) Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("Linked集合存儲數(shù)據(jù)量為10000000,執(zhí)行開始:"); LinkedList<int> list = new LinkedList<int>(); //// 定義一個數(shù)組 for (int i = 0; i < 10000000; i++) { list.AddFirst(1 + 1); } //需要統(tǒng)計時間的代碼段 st.Stop();//終止計時 Console.WriteLine(string.Format("Linked集合存儲數(shù)據(jù)量為10000000,執(zhí)行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString())); } }

六、每種集合數(shù)據(jù)執(zhí)行結(jié)果對比分析

class Program { static void Main(string[] args) { //// array數(shù)組操作測試 ArrayTest.IntArrayTest(); //// arrayList集合操測試 ArrayListTest.ArrayListOpert(); //// List集合操作測試 ListTest.ListOpert(); //// LinkedList集合操作測試 LinkedListTest.LinkedListTestOpert(); ///// 通過測試數(shù)據(jù) //通過測試數(shù)據(jù)大概可以分析得出一些結(jié)論 //1、整體效率上Array效率最高,ArrayList效率最低,List效率介于Array和ArrayList之間 //2、ArrayList和List集合,在定義時如果知道數(shù)據(jù)長度,那么初始化時,指定長度的效率比不指定的長度效率高 //總結(jié): //在數(shù)據(jù)集合使用選擇上給出以下一些建議: //1、Array:當元素的數(shù)量是固定的,并且需要使用下標時 //2、ArrayList:當存儲的元素類型不同時 //3、List:當元素的數(shù)量是固定的,并且需要使用下標時 //4、LinkedList:當元素需要能夠在列表的兩端添加時 Console.ReadLine(); } }

  執(zhí)行結(jié)果數(shù)據(jù)

通過測試數(shù)據(jù)大概可以分析得出一些結(jié)論1、整體效率上Array效率最高,ArrayList效率最低,List效率介于Array和ArrayList之間2、ArrayList和List集合,在定義時如果知道數(shù)據(jù)長度,那么初始化時,指定長度的效率比不指定的長度效率高

七、總結(jié):

在數(shù)據(jù)集合使用選擇上給出以下一些建議:1、Array:當元素的數(shù)量是固定的,并且需要使用下標時2、ArrayList:當存儲的元素類型不同時,初始化時給一個預(yù)估的長度3、List:當元素的數(shù)量是固定的,并且需要使用下標時,初始化時給一個預(yù)估的長度4、LinkedList:當元素需要能夠在列表的兩端添加時

長按打開更多驚喜

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。