java list和數(shù)組的區(qū)別
java list和數(shù)組的區(qū)別百科
List和ArrayList的區(qū)別在于:
1、在編程語言中ArrayList類是.Net Framework提供的用于數(shù)據(jù)存儲和檢索的專用類。List 類可以簡單視之為雙向連結(jié)串行,以線性列的方式管理物件**。
List類是ArrayList類的泛型等效類。
2、ArrayList繼承了IList接口,所以它可以很方便的進(jìn)行數(shù)據(jù)的添加,插入和移除。List的大部分用法都與ArrayList相似,List類也繼承了IList接口。
3、在ArrayList中可以插入不同類型的數(shù)據(jù)。ArrayList會(huì)把所有插入其中的數(shù)據(jù)都當(dāng)作為object類型來處理,這其中存在裝箱與拆箱的操作,會(huì)對系統(tǒng)造成性能上的損耗。
而List需要聲明其數(shù)據(jù)的對象類型。聲明后插入其他類型數(shù)據(jù),IDE就會(huì)報(bào)錯(cuò),且不能通過編譯。
4、在使用ArrayList中的數(shù)據(jù)來處理問題的時(shí)候,很可能會(huì)報(bào)類型不匹配的錯(cuò)誤,即ArrayList不是類型安全的。
而List已經(jīng)聲明過其數(shù)據(jù)的對象類型,是類型安全的,避免了前面講的類型安全問題與裝箱拆箱的性能問題。
5、ListArray就可以被構(gòu)造。而List不能被構(gòu)造,但可以為List創(chuàng)建一個(gè)引用。
擴(kuò)展資料:
一、List泛型
通過允許指定泛型類或方法操作的特定類型,泛型功能將類型安全的任務(wù)從程序員轉(zhuǎn)移給了編譯器。不需要編寫代碼來檢測數(shù)據(jù)類型是否正確,因?yàn)闀?huì)在編譯時(shí)強(qiáng)制使用正確的數(shù)據(jù)類型。減少了類型強(qiáng)制轉(zhuǎn)換的需要和運(yùn)行時(shí)錯(cuò)誤的可能性。
泛型提供了類型安全但沒有增加多個(gè)實(shí)現(xiàn)的開銷。
二、裝箱與拆箱的概念:
1、裝箱:就是將值類型的數(shù)據(jù)打包到引用類型的實(shí)例中 比如將int類型的值123賦給object對象o
int i=123; object o=(object)i;
2、拆箱:就是從引用數(shù)據(jù)中提取值類型 比如將object對象o的值賦給int類型的變量i
object o=123; int i=(int)o;
3、裝箱與拆箱的過程是很損耗性能的。
數(shù)組、ArrayList、List三者的區(qū)別
注:學(xué)習(xí)筆記,用于翻看查找 一、 數(shù)組 優(yōu)點(diǎn):在內(nèi)存中時(shí)連續(xù)的,速度較快,操作簡單。 缺點(diǎn):定義數(shù)組時(shí)要定義其長度,不是很靈活,過長過短都會(huì)造成問題。
不方便進(jìn)行數(shù)據(jù)的添加、插入和移除。
例如:int [] i=new int[2]; i[0]=111; i[1]=123;//賦值 i[1]=1234;//修改 二、**ArrayList 優(yōu)點(diǎn):命名空間System.Collections下的一部分。大小是動(dòng)態(tài)擴(kuò)充與收縮的。在聲明ArrayList對象時(shí)不需要指定它的長度。ArrayList繼承了IList接口,可以很方便的進(jìn)行數(shù)據(jù)的添加、插入和移除. 缺點(diǎn):當(dāng)向**插入不同類型的數(shù)據(jù)后(ArrayList將數(shù)據(jù)當(dāng)作object存儲),在進(jìn)行數(shù)據(jù)處理時(shí)容易出現(xiàn)類型不匹配的錯(cuò)誤,使用時(shí)需要進(jìn)行類型轉(zhuǎn)換處理,存在裝箱與拆箱操作,造成性能大量損耗的現(xiàn)象。
例如:ArrayList list = new ArrayList(); list.Add(“aa”); list.Add(11); list[1] = 123;//修改 移除list.Remove(123); list.RemoveAt(0); 三、泛型List 優(yōu)點(diǎn):與**ArrayList類似且繼承IList接口,在聲明List**時(shí)也要聲明**內(nèi)部數(shù)據(jù)的對象類型,避免了裝箱和拆箱的問題。 例如:List<int> list=new List<int>(); list.Add(123); list[0]=111;//修改 list.RemoveAt(0);//移除 如果list.Add(“abc”);//編譯器就會(huì)報(bào)錯(cuò),避免了類型安全問題與裝箱拆箱的性能問題。
數(shù)組、List中不同類的區(qū)別
1、Vector是線程安全的,方法使用synchronized關(guān)鍵字修飾。ArrayList不是。
2、當(dāng)需要擴(kuò)容時(shí),ArrayList擴(kuò)容原來的0.5倍,Vector擴(kuò)容原來的1倍。
1、Array可以存儲對象或者基本數(shù)據(jù)類型,但是ArrayList只能存儲對象。 2、Array是固定大小的,ArrayList是可以自動(dòng)擴(kuò)展的。 3、Array的內(nèi)置方法沒有ArrayList多。 相同點(diǎn): 都返回隊(duì)列的**個(gè)元素,并從隊(duì)列中刪除這個(gè)元素。
不同點(diǎn): 如果Queue為空,poll返回null。remove 拋出NoSuchElementException異常。 LinkedList:雙向鏈表 HashMap:數(shù)組+單向鏈表+紅黑樹 HashSet:HashMap LinkedHashMap:使用HashMap存儲數(shù)據(jù),使用LinkedList存儲順序。
HashMap 允許 key 和 value 為 null,Hashtable 不允許。 HashMap 的默認(rèn)初始容量為 16,Hashtable 為 11。 HashMap 的擴(kuò)容為原來的 2 倍,Hashtable 的擴(kuò)容為原來的 2 倍加 1。
HashMap 是非線程安全的,Hashtable是線程安全的。 HashMap 的 hash 值重新計(jì)算過,Hashtable 直接使用 hashCode。 HashMap 去掉了 Hashtable 中的 contains 方法。
HashMap 繼承自 AbstractMap 類,Hashtable 繼承自 Dictionary 類。
關(guān)于Array和List的區(qū)別
在Java中 Array是數(shù)組,List是**。數(shù)組直接可以使用,List是借口,需要使用實(shí)現(xiàn)類,比如:ArrayList。
使用方式也不同,Array數(shù)組使用下標(biāo)獲取元素,List是get(index)初始化Array數(shù)組必須指定大小,不靈活。
List 可以自己擴(kuò)充大小,方便。