Java中ArrayList和LinkedList之間的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
一、ArrayList
ArrayList是一個(gè)可以處理變長(zhǎng)數(shù)組的類型,這里不局限于“數(shù)”組,ArrayList是一個(gè)泛型類,可以存放任意類型的對(duì)象。顧名思義,ArrayList是一個(gè)數(shù)組列表,因此其內(nèi)部是使用一個(gè)數(shù)組來(lái)存放對(duì)象的,因?yàn)镺bject是一切類型的父類,因而ArrayList內(nèi)部是有一個(gè)Object類型的數(shù)組類存放對(duì)象。ArrayList類常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同時(shí)ArrayList內(nèi)部有一個(gè)私有類實(shí)現(xiàn)Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器,同時(shí),還有一個(gè)私有類實(shí)現(xiàn)了ListIterator接口,因此ArrayList也可以調(diào)用listIterator()方法得到ListIterator迭代器。
由于ArrayList是依靠數(shù)組來(lái)存放對(duì)象的,只不過(guò)封裝起來(lái)了而已,因此其一些查找方法的效率都是O(n),跟普通的數(shù)組效率差不多,只不過(guò)這個(gè)ArrayList是一個(gè)可變”數(shù)組“,并且可以存放一切指定的對(duì)象。
另外,由于ArrayList的所有方法都是默認(rèn)在單一線程下進(jìn)行的,因此ArrayList不具有線程安全性。若想在多線程下使用,應(yīng)該使用Colletions類中的靜態(tài)方法synchronizedList()對(duì)ArrayList進(jìn)行調(diào)用即可。
二、LinkedList
LinkedList可以看做為一個(gè)雙向鏈表,所有的操作都可以認(rèn)為是一個(gè)雙向鏈表的操作,因?yàn)樗鼘?shí)現(xiàn)了Deque接口和List接口。同樣,LinkedList也是線程不安全的,如果在并發(fā)環(huán)境下使用它,同樣用Colletions類中的靜態(tài)方法synchronizedList()對(duì)LinkedList進(jìn)行調(diào)用即可。
在LinkedList的內(nèi)部實(shí)現(xiàn)中,并不是用普通的數(shù)組來(lái)存放數(shù)據(jù)的,而是使用結(jié)點(diǎn)<Node>來(lái)存放數(shù)據(jù)的,有一個(gè)指向鏈表頭的結(jié)點(diǎn)first和一個(gè)指向鏈表尾的結(jié)點(diǎn)last。不同于ArrayList只能在數(shù)組末尾添加數(shù)據(jù),LinkList可以很方便在鏈表頭或者鏈表尾插入數(shù)據(jù),或者在指定結(jié)點(diǎn)前后插入數(shù)據(jù),還提供了取走鏈表頭或鏈表尾的結(jié)點(diǎn),或取走中間某個(gè)結(jié)點(diǎn),還可以查詢某個(gè)結(jié)點(diǎn)是否存在。add()方法默認(rèn)在鏈表尾部插入數(shù)據(jù)??傊?,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明顯高于ArrayList類型,但是查詢的效率要低一點(diǎn),因?yàn)樗且粋€(gè)雙向鏈表。
因此,LinkedList與ArrayList最大的區(qū)別是LinkedList更加靈活,并且部分方法的效率比ArrayList對(duì)應(yīng)方法的效率要高很多,對(duì)于數(shù)據(jù)頻繁出入的情況下,并且要求操作要足夠靈活,建議使用LinkedList;對(duì)于數(shù)組變動(dòng)不大,主要是用來(lái)查詢的情況下,可以使用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方法對(duì)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) ;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java中ArrayList和LinkedList的區(qū)別詳解
- 淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系
- 淺析 ArrayList 和 LinkedList 有什么區(qū)別
- ArrayList和LinkedList區(qū)別及使用場(chǎng)景代碼解析
- Java面試崗常見(jiàn)問(wèn)題之ArrayList和LinkedList的區(qū)別
- Java ArrayList與LinkedList及HashMap容器的用法區(qū)別
- Java中ArrayList和LinkedList的區(qū)別
- Java中ArrayList和LinkedList區(qū)別
- ArrayList與linkedList的用法區(qū)別及擴(kuò)容方式
- Java中ArrayList和LinkedList有什么區(qū)別舉例詳解
相關(guān)文章
JAVA操作MongoDB數(shù)據(jù)庫(kù)實(shí)例教程
MongoDB是一個(gè)文檔型數(shù)據(jù)庫(kù),是NOSQL家族中最重要的成員之一,下面這篇文章主要給大家介紹了關(guān)于JAVA操作MongoDB數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切
這篇文章主要給大家介紹了關(guān)于Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06
簡(jiǎn)單總結(jié)Java的反射機(jī)制的運(yùn)用
這篇文章主要介紹了Java的反射機(jī)制的運(yùn)用,對(duì)一些常用的類作了一些說(shuō)明,需要的朋友可以參考下2015-11-11
maven deploy時(shí)報(bào)錯(cuò)的解決方法
這篇文章主要介紹了maven deploy時(shí)報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
java如何實(shí)現(xiàn)遞歸刪除樹(shù)形數(shù)據(jù)的任一個(gè)節(jié)點(diǎn)
文章講述了在Java中實(shí)現(xiàn)遞歸刪除樹(shù)形數(shù)據(jù)的任一個(gè)節(jié)點(diǎn)時(shí)需要注意的三個(gè)點(diǎn),包括刪除的節(jié)點(diǎn)包含子節(jié)點(diǎn)、刪除子節(jié)點(diǎn)和其他子節(jié)點(diǎn)刪除的節(jié)點(diǎn)不包含子節(jié)點(diǎn)、以及該父節(jié)點(diǎn)變成葉子節(jié)點(diǎn),此外,文章還提到這兩件事包含在同一件事務(wù)中2024-12-12
java仿Servlet生成驗(yàn)證碼實(shí)例詳解
這篇文章主要介紹了java仿Servlet生成驗(yàn)證碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
微信小程序與AspNetCore SignalR聊天實(shí)例代碼
這篇文章主要介紹了微信小程序與AspNetCore SignalR聊天實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
通過(guò)openOffice將office文件轉(zhuǎn)成pdf
這篇文章主要介紹了通過(guò)openOffice將office文件轉(zhuǎn)成pdf,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11

