arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析
作者:小許子
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ū)別,在使用時(shí)需要注意一些什么呢?下面根據(jù)個(gè)人的經(jīng)驗(yàn),對這一些集合數(shù)據(jù)的使用做一個(gè)簡單的小結(jié),如果說的不對的地方,歡迎指出,多多交流改進(jìn)。
二、Array集合簡介
Array集合,也就是數(shù)組,是最簡單的數(shù)據(jù)結(jié)構(gòu),其存儲(chǔ)的數(shù)據(jù)在內(nèi)存空間是連續(xù)的,數(shù)組有一下一些特點(diǎn)
1.數(shù)據(jù)存儲(chǔ)是連續(xù)的
2.數(shù)組長度在定義時(shí)就必須制定
3.數(shù)組存儲(chǔ)的數(shù)據(jù)類型都是同一類型
4.數(shù)組可以直接通過小標(biāo)訪問
優(yōu)缺點(diǎn): ? 優(yōu)點(diǎn): 1、可以根據(jù)索引直接訪問,訪問速度快 ? 2、數(shù)據(jù)是安全的,由于數(shù)據(jù)類型一致性,在存儲(chǔ)使用過程中不涉及 缺點(diǎn): 1、由于數(shù)據(jù)是連續(xù)存儲(chǔ)的,導(dǎo)致插入效率變慢 ? ?2、由于數(shù)組長度大小固定,那么對預(yù)期非固定長度的數(shù)字不好處理
練習(xí)實(shí)例代碼:
/// /// 數(shù)組練習(xí)操作 /// public class ArrayTest { /// 數(shù)組 Array 對于大家來說一點(diǎn)都不陌生 /// 數(shù)組是在內(nèi)存連續(xù)分配的存儲(chǔ)空間,這也導(dǎo)致數(shù)組有一下一些特點(diǎn) /// 1.數(shù)據(jù)存儲(chǔ)是連續(xù)的 /// 2.數(shù)組長度在定義時(shí)就必須制定 /// 3.數(shù)組存儲(chǔ)的數(shù)據(jù)類型都是同一類型 /// 4.數(shù)組可以直接通過小標(biāo)訪問 /// /// 優(yōu)缺點(diǎn): /// 優(yōu)點(diǎn): /// 1、可以根據(jù)索引直接訪問,訪問速度快 /// 2、數(shù)據(jù)是安全的,由于數(shù)據(jù)類型一致性,在存儲(chǔ)使用過程中不涉及到裝箱拆箱操作 /// 缺點(diǎn): /// 1、由于數(shù)據(jù)是連續(xù)存儲(chǔ)的,導(dǎo)致插入效率變慢 /// 2、由于數(shù)組長度大小固定,那么對預(yù)期非固定長度的數(shù)字不好處理 /// int類型的數(shù)組操作 public static void IntArrayTest() { //// 定義一個(gè)秒表,執(zhí)行獲取執(zhí)行時(shí)間 Stopwatch st = new Stopwatch();//實(shí)例化類 st.Start();//開始計(jì)時(shí) Console.WriteLine("開始初始化長度為10000000的int數(shù)組:"); //// 定義一個(gè)數(shù)組 int[] nums = new int[10000000]; for (int i = 0; i < 10000000; i++) { nums[i] = 1 + 1; } //需要統(tǒng)計(jì)時(shí)間的代碼段 st.Stop();//終止計(jì)時(shí) Console.WriteLine(string.Format("初始化長度為10000的int數(shù)組完畢!總耗時(shí){0}毫秒", st.ElapsedMilliseconds.ToString())); } }三、ArrayList集合簡介
ArrayList 是Array的升級(jí)版,能夠解決Array的一些缺點(diǎn)ArrayList其內(nèi)部實(shí)現(xiàn)也是Array,只是其長度是可以動(dòng)態(tài),在其內(nèi)部用一個(gè)變量記錄控制長度,ArrayList有如下一些特點(diǎn)
1.長度不固定
2.可以存儲(chǔ)不同的數(shù)據(jù)類型(object)
3.同樣支持索引查詢(可以直接通過小標(biāo)訪問)
4.靈活性更強(qiáng),以犧牲性能為代價(jià)
優(yōu)缺點(diǎn):優(yōu)點(diǎn):1、長度不固定,在定義是不必?fù)?dān)長度溢出2、可以存儲(chǔ)任意數(shù)據(jù)類型3、可根據(jù)索引查詢,查詢效率快缺點(diǎn):1、由于長度不固定,執(zhí)行效率低下,因?yàn)槌瞿J(rèn)長度(10)后,會(huì)自動(dòng)擴(kuò)容拷貝數(shù)據(jù),犧牲性能2、由于存儲(chǔ)類型是object,所以在存數(shù)據(jù)時(shí)會(huì)有裝箱操作,在取數(shù)據(jù)時(shí)會(huì)有拆箱操作,影響效率3、線程不安全,因?yàn)槠鋬?nèi)部實(shí)現(xiàn)是用size、array來共同控制,在新增操作時(shí)是非原子操作,所以非安全線程使用技巧:在實(shí)際使用過程中,為了避免自動(dòng)擴(kuò)容,可以預(yù)估數(shù)據(jù)長度,初始化一個(gè)數(shù)據(jù)長度,從而提高效率
練習(xí)實(shí)例代碼:
/// /// ArrayList數(shù)組練習(xí)操作 /// public class ArrayListTest { /// ArrayList 是Array的升級(jí)版,能夠解決Array的一些缺點(diǎn) /// ArrayList其內(nèi)部實(shí)現(xiàn)也是Array,只是其長度是可以動(dòng)態(tài),在其內(nèi)部用一個(gè)變量記錄控制長度,ArrayList有如下一些特點(diǎn) /// 1.長度不固定 /// 2.可以存儲(chǔ)不同的數(shù)據(jù)類型(object) /// 3.同樣支持索引查詢(可以直接通過小標(biāo)訪問) /// 4.靈活性更強(qiáng),以犧牲性能為代價(jià) /// 優(yōu)缺點(diǎn): /// 優(yōu)點(diǎn): /// 1、長度不固定,在定義是不必?fù)?dān)長度溢出 /// 2、可以存儲(chǔ)任意數(shù)據(jù)類型 /// 3、可根據(jù)索引查詢,查詢效率快 /// 缺點(diǎn): /// 1、由于長度不固定,執(zhí)行效率低下,因?yàn)槌瞿J(rèn)長度(10)后,會(huì)自動(dòng)擴(kuò)容拷貝數(shù)據(jù),犧牲性能 /// 2、由于存儲(chǔ)類型是object,所以在存數(shù)據(jù)時(shí)會(huì)有裝箱操作,在取數(shù)據(jù)時(shí)會(huì)有拆箱操作,影響效率 /// 3、線程不安全,因?yàn)槠鋬?nèi)部實(shí)現(xiàn)是用size、array來共同控制,在新增操作時(shí)是非原子操作,所以非安全線程 /// /// 使用技巧: /// 在實(shí)際使用過程中,為了避免自動(dòng)擴(kuò)容,可以預(yù)估數(shù)據(jù)長度,初始化一個(gè)數(shù)據(jù)長度,從而提高效率 /// ArrayList操作實(shí)例 public static void ArrayListOpert() { //// 定義一個(gè)秒表,執(zhí)行獲取執(zhí)行時(shí)間 Stopwatch st = new Stopwatch();//實(shí)例化類 //// 需要統(tǒng)計(jì)時(shí)間的代碼段(統(tǒng)計(jì)初始化長度時(shí)的執(zhí)行時(shí)間) st.Start();//開始計(jì)時(shí) Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("ArryList集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化一個(gè)長度,執(zhí)行開始:"); ArrayList arrayList = new ArrayList(10000000); //// 定義一個(gè)數(shù)組 for (int i = 0; i < 10000000; i++) { arrayList.Add(1 + 1); } st.Stop();//終止計(jì)時(shí) Console.WriteLine(string.Format("ArryList集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化一個(gè)長度,執(zhí)行完畢:!總耗時(shí){0}毫秒", st.ElapsedMilliseconds.ToString())); //// 需要統(tǒng)計(jì)時(shí)間的代碼段(統(tǒng)計(jì)初始化非指定長度時(shí)的執(zhí)行時(shí)間) st.Restart(); Console.WriteLine(""); Console.WriteLine("ArryList集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行開始:"); arrayList = new ArrayList(); //// 定義一個(gè)數(shù)組 for (int i = 0; i < 10000000; i++) { arrayList.Add(1 + 1); } st.Stop();//終止計(jì)時(shí) Console.WriteLine(string.Format("ArryList集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行完畢:!總耗時(shí){0}毫秒", st.ElapsedMilliseconds.ToString())); } }四、List集合簡介
隨著c#泛型的推出,為了避免ArrayList一些缺點(diǎn),微軟推出了List集合List集合內(nèi)部還是采用的Array實(shí)現(xiàn),同時(shí)在定義時(shí)需要指定對應(yīng)的數(shù)據(jù)類型這樣級(jí)保留了Array集合的優(yōu)點(diǎn),同時(shí)也避免了ArrayList集合的數(shù)據(jù)類型不安全和裝箱帶來的性能犧牲List特點(diǎn):
1、數(shù)據(jù)長度不固定,自動(dòng)增加
2、存儲(chǔ)相同的數(shù)據(jù)類型
3、可根據(jù)索引查詢,查詢效率快
優(yōu)缺點(diǎn):優(yōu)點(diǎn):1、長度不固定,在定義是不必?fù)?dān)長度溢出2、存儲(chǔ)相同數(shù)據(jù)類型的數(shù)據(jù),避免的數(shù)據(jù)的裝箱拆箱,提高了數(shù)據(jù)處理效率3、支持索引查詢,查詢效率快缺點(diǎn):1、由于長度不固定,執(zhí)行效率低下,因?yàn)槌瞿J(rèn)長度(10)后,會(huì)自動(dòng)擴(kuò)容拷貝數(shù)據(jù),犧牲性能2、線程不安全,因?yàn)槠鋬?nèi)部實(shí)現(xiàn)是用size、array來共同控制,在新增操作時(shí)是非原子操作,所以非安全線程
練習(xí)實(shí)例代碼:
/// /// List練習(xí)操作 /// public class ListTest { /// 隨著c#泛型的推出,為了避免ArrayList一些缺點(diǎn),微軟推出了List集合 /// List集合內(nèi)部還是采用的Array實(shí)現(xiàn),同時(shí)在定義時(shí)需要指定對應(yīng)的數(shù)據(jù)類型 /// 這樣級(jí)保留了Array集合的優(yōu)點(diǎn),同時(shí)也避免了ArrayList集合的數(shù)據(jù)類型不安全和裝箱帶來的性能犧牲 /// List特點(diǎn): /// 1、數(shù)據(jù)長度不固定,自動(dòng)增加 /// 2、存儲(chǔ)相同的數(shù)據(jù)類型 /// 3、可根據(jù)索引查詢,查詢效率快 /// /// 優(yōu)缺點(diǎn): /// 優(yōu)點(diǎn): /// 1、長度不固定,在定義是不必?fù)?dān)長度溢出 /// 2、存儲(chǔ)相同數(shù)據(jù)類型的數(shù)據(jù),避免的數(shù)據(jù)的裝箱拆箱,提高了數(shù)據(jù)處理效率 /// 3、支持索引查詢,查詢效率快 /// 缺點(diǎn): /// 1、由于長度不固定,執(zhí)行效率低下,因?yàn)槌瞿J(rèn)長度(10)后,會(huì)自動(dòng)擴(kuò)容拷貝數(shù)據(jù),犧牲性能 /// 2、線程不安全,因?yàn)槠鋬?nèi)部實(shí)現(xiàn)是用size、array來共同控制,在新增操作時(shí)是非原子操作,所以非安全線程 /// ArrayList操作實(shí)例 public static void ListOpert(){ 定義一個(gè)秒表,執(zhí)行獲取執(zhí)行時(shí)間 Stopwatch st = new Stopwatch();//實(shí)例化類 st.Start();//開始計(jì)時(shí) 需要統(tǒng)計(jì)時(shí)間的代碼段(統(tǒng)計(jì)初始化長度時(shí)的執(zhí)行時(shí)間) Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("List集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化一個(gè)長度,執(zhí)行開始:"); List<int> list = new List<int>(10000000); 定義一個(gè)數(shù)組 for (int i = 0; i < 10000000; i++) { list.Add(1 + 1); } //需要統(tǒng)計(jì)時(shí)間的代碼段 st.Stop();//終止計(jì)時(shí) Console.WriteLine(string.Format("List集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化一個(gè)長度,執(zhí)行完畢:!總耗時(shí){0}毫秒", st.ElapsedMilliseconds.ToString())); 需要統(tǒng)計(jì)時(shí)間的代碼段(統(tǒng)計(jì)初始化非指定長度時(shí)的執(zhí)行時(shí)間) st.Restart(); Console.WriteLine(""); Console.WriteLine("List集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行開始:"); list = new List<int>(); 定義一個(gè)數(shù)組 for (int i = 0; i < 10000000; i++) { list.Add(1 + 1); } st.Stop();//終止計(jì)時(shí) Console.WriteLine(string.Format("List集合存儲(chǔ)數(shù)據(jù)量為10000000,初始化不指定長度,執(zhí)行完畢:!總耗時(shí){0}毫秒", st.ElapsedMilliseconds.ToString())); } }五、LinkedList集合簡介
LinkedList鏈表的底層是采用雙向鏈表的方式實(shí)現(xiàn),在鏈表(Linked List)中,每一個(gè)元素都指向下一個(gè)元素,以此來形成了一個(gè)鏈(chain)可以從頭部和尾部插入數(shù)據(jù),在存儲(chǔ)內(nèi)存上采用非連續(xù)方式存儲(chǔ),鏈表有如下一些特點(diǎn)
1、內(nèi)存存儲(chǔ)上是非連續(xù)的
2、能夠支持從頭部和底部同時(shí)插入
3、長度是非固定的
優(yōu)缺點(diǎn):優(yōu)點(diǎn):1、由于非連續(xù)存儲(chǔ),中部插入和刪除元素效率高2、長度非固定,在創(chuàng)建時(shí)不用考慮其長度3、可以沖頭部和底部添加元素4、數(shù)據(jù)類型是安全的,在創(chuàng)建時(shí)需要指定的數(shù)據(jù)類型缺點(diǎn):1、由于非連續(xù)存儲(chǔ),不能通過小標(biāo)訪問,查詢效率低
練習(xí)實(shí)例代碼:
/// /// LinkedList練習(xí)操作 /// public class LinkedListTest { /// LinkedList鏈表的底層是采用雙向鏈表的方式實(shí)現(xiàn), /// 在鏈表(Linked List)中,每一個(gè)元素都指向下一個(gè)元素,以此來形成了一個(gè)鏈(chain) /// 可以從頭部和尾部插入數(shù)據(jù),在存儲(chǔ)內(nèi)存上采用非連續(xù)方式存儲(chǔ),鏈表有如下一些特點(diǎn) /// 1、內(nèi)存存儲(chǔ)上是非連續(xù)的 /// 2、能夠支持從頭部和底部同時(shí)插入 /// 3、長度是非固定的 /// 優(yōu)缺點(diǎn): /// 優(yōu)點(diǎn): /// 1、由于非連續(xù)存儲(chǔ),中部插入和刪除元素效率高 /// 2、長度非固定,在創(chuàng)建時(shí)不用考慮其長度 /// 3、可以沖頭部和底部添加元素 /// 4、數(shù)據(jù)類型是安全的,在創(chuàng)建時(shí)需要指定的數(shù)據(jù)類型 /// 缺點(diǎn): /// 1、由于非連續(xù)存儲(chǔ),不能通過小標(biāo)訪問,查詢效率低 /// LinkedList操作實(shí)例 public static void LinkedListTestOpert() { //// 定義一個(gè)秒表,執(zhí)行獲取執(zhí)行時(shí)間 Stopwatch st = new Stopwatch();//實(shí)例化類 st.Start();//開始計(jì)時(shí) //// 需要統(tǒng)計(jì)時(shí)間的代碼段(統(tǒng)計(jì)初始化長度時(shí)的執(zhí)行時(shí)間) Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("Linked集合存儲(chǔ)數(shù)據(jù)量為10000000,執(zhí)行開始:"); LinkedList<int> list = new LinkedList<int>(); //// 定義一個(gè)數(shù)組 for (int i = 0; i < 10000000; i++) { list.AddFirst(1 + 1); } //需要統(tǒng)計(jì)時(shí)間的代碼段 st.Stop();//終止計(jì)時(shí) Console.WriteLine(string.Format("Linked集合存儲(chǔ)數(shù)據(jù)量為10000000,執(zhí)行完畢:!總耗時(shí){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í)如果知道數(shù)據(jù)長度,那么初始化時(shí),指定長度的效率比不指定的長度效率高 //總結(jié): //在數(shù)據(jù)集合使用選擇上給出以下一些建議: //1、Array:當(dāng)元素的數(shù)量是固定的,并且需要使用下標(biāo)時(shí) //2、ArrayList:當(dāng)存儲(chǔ)的元素類型不同時(shí) //3、List:當(dāng)元素的數(shù)量是固定的,并且需要使用下標(biāo)時(shí) //4、LinkedList:當(dāng)元素需要能夠在列表的兩端添加時(shí) Console.ReadLine(); } }執(zhí)行結(jié)果數(shù)據(jù)
通過測試數(shù)據(jù)大概可以分析得出一些結(jié)論1、整體效率上Array效率最高,ArrayList效率最低,List效率介于Array和ArrayList之間2、ArrayList和List集合,在定義時(shí)如果知道數(shù)據(jù)長度,那么初始化時(shí),指定長度的效率比不指定的長度效率高
七、總結(jié):
在數(shù)據(jù)集合使用選擇上給出以下一些建議:1、Array:當(dāng)元素的數(shù)量是固定的,并且需要使用下標(biāo)時(shí)2、ArrayList:當(dāng)存儲(chǔ)的元素類型不同時(shí),初始化時(shí)給一個(gè)預(yù)估的長度3、List:當(dāng)元素的數(shù)量是固定的,并且需要使用下標(biāo)時(shí),初始化時(shí)給一個(gè)預(yù)估的長度4、LinkedList:當(dāng)元素需要能夠在列表的兩端添加時(shí)
長按打開更多驚喜
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者换系统在哪里换 王者荣耀官方网站
- 下一篇: 王者荣耀信号在哪设置 2017年赵寅成