Java中ArrayList和LinkedList之間的區(qū)別_動力節(jié)點Java學(xué)院整理
一、ArrayList
ArrayList是一個可以處理變長數(shù)組的類型,這里不局限于“數(shù)”組,ArrayList是一個泛型類,可以存放任意類型的對象。顧名思義,ArrayList是一個數(shù)組列表,因此其內(nèi)部是使用一個數(shù)組來存放對象的,因為Object是一切類型的父類,因而ArrayList內(nèi)部是有一個Object類型的數(shù)組類存放對象。ArrayList類常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同時ArrayList內(nèi)部有一個私有類實現(xiàn)Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器,同時,還有一個私有類實現(xiàn)了ListIterator接口,因此ArrayList也可以調(diào)用listIterator()方法得到ListIterator迭代器。
由于ArrayList是依靠數(shù)組來存放對象的,只不過封裝起來了而已,因此其一些查找方法的效率都是O(n),跟普通的數(shù)組效率差不多,只不過這個ArrayList是一個可變”數(shù)組“,并且可以存放一切指定的對象。
另外,由于ArrayList的所有方法都是默認(rèn)在單一線程下進(jìn)行的,因此ArrayList不具有線程安全性。若想在多線程下使用,應(yīng)該使用Colletions類中的靜態(tài)方法synchronizedList()對ArrayList進(jìn)行調(diào)用即可。
二、LinkedList
LinkedList可以看做為一個雙向鏈表,所有的操作都可以認(rèn)為是一個雙向鏈表的操作,因為它實現(xiàn)了Deque接口和List接口。同樣,LinkedList也是線程不安全的,如果在并發(fā)環(huán)境下使用它,同樣用Colletions類中的靜態(tài)方法synchronizedList()對LinkedList進(jìn)行調(diào)用即可。
在LinkedList的內(nèi)部實現(xiàn)中,并不是用普通的數(shù)組來存放數(shù)據(jù)的,而是使用結(jié)點<Node>來存放數(shù)據(jù)的,有一個指向鏈表頭的結(jié)點first和一個指向鏈表尾的結(jié)點last。不同于ArrayList只能在數(shù)組末尾添加數(shù)據(jù),LinkList可以很方便在鏈表頭或者鏈表尾插入數(shù)據(jù),或者在指定結(jié)點前后插入數(shù)據(jù),還提供了取走鏈表頭或鏈表尾的結(jié)點,或取走中間某個結(jié)點,還可以查詢某個結(jié)點是否存在。add()方法默認(rèn)在鏈表尾部插入數(shù)據(jù)。總之,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明顯高于ArrayList類型,但是查詢的效率要低一點,因為它是一個雙向鏈表。
因此,LinkedList與ArrayList最大的區(qū)別是LinkedList更加靈活,并且部分方法的效率比ArrayList對應(yīng)方法的效率要高很多,對于數(shù)據(jù)頻繁出入的情況下,并且要求操作要足夠靈活,建議使用LinkedList;對于數(shù)組變動不大,主要是用來查詢的情況下,可以使用ArrayList。
import java.util.* ; public class ListDemo01{ public static void main(String args[]){ List<Integer> li = new LinkedList<Integer>() ; long startTime = System.currentTimeMillis() ; for(int i=0;i<1000000;i++){ li.add(0,i) ; //print : 803 //li.add(i) ; //print : 790 } long endTime = System.currentTimeMillis() ; System.out.println(endTime-startTime) ; } }
下面的代碼得不出結(jié)果速度太慢
import java.util.* ; public class ListDemo01{ public static void main(String args[]){ List<Integer> li = new LinkedList<Integer>() ; for(int i=0;i<1000000;i++){ li.add(0,i) ; //print : 803 //li.add(i) ; //print : 790 } long startTime = System.currentTimeMillis() ; for(int i=0;i<1000000;i++){ li.get(i) ; } long endTime = System.currentTimeMillis() ; System.out.println(endTime-startTime) ; } }
下面化成ArrayList速度就超快
import java.util.* ; public class ListDemo01{ public static void main(String args[]){ List<Integer> li = new ArrayList<Integer>() ; for(int i=0;i<1000000;i++){ li.add(i) ; } long startTime = System.currentTimeMillis() ; for(int i=0;i<1000000;i++){ li.get(i) ; //print : 15 } long endTime = System.currentTimeMillis() ; System.out.println(endTime-startTime) ; } }
remove方法對LinkedList類的使用
a.利用iterator類
import java.util.* ; public class ListDemo01{ public static void main(String args[]){ List<Integer> li = new LinkedList<Integer>() ; for(int i=0;i<1000000;i++){ li.add(i) ; } long startTime = System.currentTimeMillis() ; Iterator<Integer> it = li.iterator() ; while(it.hasNext()){ if(it.next()%2==0){ it.remove() ; } } long endTime = System.currentTimeMillis() ; System.out.println(endTime-startTime) ; } }
b.不利用iterator的話則則需要調(diào)用get方法。則效率很低
import java.util.* ; public class ListDemo01{ public static void main(String args[]){ List<Integer> li = new LinkedList<Integer>() ; for(int i=0;i<1000000;i++){ li.add(i) ; } long startTime = System.currentTimeMillis() ; for(int i=0;i<10000;i++){ if(li.get(i)%2==0){ li.remove(i) ; } } long endTime = System.currentTimeMillis() ; System.out.println(endTime-startTime) ; } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java中ArrayList和LinkedList的區(qū)別詳解
- 淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系
- 淺析 ArrayList 和 LinkedList 有什么區(qū)別
- ArrayList和LinkedList區(qū)別及使用場景代碼解析
- Java面試崗常見問題之ArrayList和LinkedList的區(qū)別
- Java ArrayList與LinkedList及HashMap容器的用法區(qū)別
- Java中ArrayList和LinkedList的區(qū)別
- Java中ArrayList和LinkedList區(qū)別
- ArrayList與linkedList的用法區(qū)別及擴容方式
- Java中ArrayList和LinkedList有什么區(qū)別舉例詳解
相關(guān)文章
FeignMultipartSupportConfig上傳圖片配置方式
這篇文章主要介紹了FeignMultipartSupportConfig上傳圖片配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03springboot如何通過controller層實現(xiàn)頁面切換
在Spring Boot中,通過Controller層實現(xiàn)頁面切換背景,Spring Boot的默認(rèn)注解是@RestController,它包含了@Controller和@ResponseBody,@ResponseBody會將返回值轉(zhuǎn)換為字符串返回,因此無法實現(xiàn)頁面切換,將@RestController換成@Controller2024-12-12spring cloud oauth2 實現(xiàn)用戶認(rèn)證登錄的示例代碼
這篇文章主要介紹了spring cloud oauth2 實現(xiàn)用戶認(rèn)證登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Sharding-JDBC自動實現(xiàn)MySQL讀寫分離的示例代碼
本文主要介紹了Sharding-JDBC自動實現(xiàn)MySQL讀寫分離,優(yōu)點在于數(shù)據(jù)源完全有Sharding-JDBC托管,寫操作自動執(zhí)行master庫,讀操作自動執(zhí)行slave庫,感興趣的可以了解一下2021-11-11