區(qū)分Java中的ArrayList和LinkedList
一:ArrayList和LinkedList的大致區(qū)別如下:
1.ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),ArrayList實(shí)現(xiàn)了長(zhǎng)度可變的數(shù)組,在內(nèi)存中分配連續(xù)的空間。遍歷元素和隨機(jī)訪問(wèn)元素的效率比較高
2.LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu), 插入、刪除元素時(shí)效率比較高 故:【插入、刪除操作頻繁時(shí),可使用LinkedList來(lái)提高效率】LinkedList提供對(duì)頭部和尾部元素進(jìn)行添加和刪除操作的方法,插入/刪除第一個(gè)和最后一個(gè)效率比較高;
3:ArrayList和LinkedList都是List接口的實(shí)現(xiàn),都存儲(chǔ)一組不唯一,有序(插入順序)的對(duì)象, 對(duì)元素進(jìn)行添加、刪除等操作[ 即:List的性質(zhì)]
4.對(duì)于隨機(jī)訪問(wèn)get和set,ArrayList覺(jué)得優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針。
5.對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。
6:LinkedList比ArrayList更占內(nèi)存
eg:(代碼示例01)----ArrayList與LinkedLis的數(shù)據(jù)添加和查找耗時(shí)對(duì)比
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class HFSD { static final int N=50000; //添加5000條數(shù)據(jù) static long timeList(List list){ //添加數(shù)據(jù)所需時(shí)間 long start=System.currentTimeMillis(); Object o = new Object(); for(int i=0;i<N;i++) { list.add(0, o); } return System.currentTimeMillis()-start; } static long readList(List list){ //查找數(shù)據(jù)所需時(shí)間 long start=System.currentTimeMillis(); for(int i=0,j=list.size();i<j;i++){ } return System.currentTimeMillis()-start; } static List addList(List list){ Object o = new Object(); for(int i=0;i<N;i++) { list.add(0, o); } return list; } public static void main(String[] args) { System.out.println("ArrayList添加"+N+"條耗時(shí):"+timeList(new ArrayList())); System.out.println("LinkedList添加"+N+"條耗時(shí):"+timeList(new LinkedList())); List list1=addList(new ArrayList<>()); List list2=addList(new LinkedList<>()); System.out.println("ArrayList查找"+N+"條耗時(shí):"+readList(list1)); System.out.println("LinkedList查找"+N+"條耗時(shí):"+readList(list2)); }
從以上結(jié)果,我i們可以看出 ArrayList更適合讀取數(shù)據(jù),linkedList更多的時(shí)候添加或刪除數(shù)據(jù)。
ArrayList:內(nèi)部是使用可増長(zhǎng)數(shù)組實(shí)現(xiàn)的,所以是用get和set方法是花費(fèi)少數(shù)時(shí)間的,但是如果插入元素和刪除元素,除非插入和刪除的位置都在表末尾,否則代碼開(kāi)銷會(huì)很大,因?yàn)槔锩嫘枰獢?shù)組的移動(dòng)。
LinkedList:是使用雙鏈表實(shí)現(xiàn)的,所以get會(huì)非常消耗資源,除非位置離頭部很近。但是插入和刪除元素花費(fèi)少數(shù)時(shí)間。
二:ArrayList和LinkedList的共有方法(即List的方法):
eg:(代碼示例02)----ArrayList代碼示例
package JIhekuangjia006.ArrayList; /** * 小豬類 */ public class Pig { private String name; private String sex; public Pig(String name,String sex){ this.name=name; this.sex=sex; } public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setSex(String sex){ this.sex=sex; } public String getSex(){ return sex; } }
package JIhekuangjia006.ArrayList; import java.util.*; /** * 使用ArrayList集合進(jìn)行操作數(shù)據(jù) */ public class Test1 { public static void main(String[] args) { //1.存儲(chǔ)小豬信息 Pig xiaojia=new Pig("小佳","母");//索引為0 Pig xiaolong=new Pig("小龍","公");//索引為1 Pig jiajia=new Pig("佳佳","女");//索引為2 Pig longlong=new Pig("龍龍","男");//索引為3(與數(shù)組相同,從0開(kāi)始) //為小豬排序 List list=new ArrayList(); //直接將元素添加排序 list.add(xiaojia); list.add(jiajia); list.add(xiaolong); //將龍龍?zhí)砑拥剿饕秊?的位置 list.add(2,longlong); //list.add(jiajia);//List 接口存儲(chǔ)一組不唯一,有序(插入順序)的對(duì)象 //2.獲得小豬的總數(shù) //通過(guò)list.size()方法獲取元素的個(gè)數(shù) list.size(); System.out.println("小豬的總數(shù)為"+list.size()); //3.逐條打印小豬信息 //方法一:for循環(huán)與get()方法配合實(shí)現(xiàn)遍歷 for(int i=0;i<list.size();i++){ Pig center=(Pig)list.get(i);//因?yàn)閘ist.get()的返回值為Object的類型,所以需要強(qiáng)轉(zhuǎn)為Pig的類型 System.out.println(center.getName()+","+center.getSex()); } //方法二:通過(guò)迭代器Iterator實(shí)現(xiàn)遍歷 // Iterator it=list.iterator(); // while (it.hasNext()){ // Pig center=(Pig)it.next(); // System.out.println(center.getName()+","+center.getSex()); // } System.out.println("*********************************************************"); //4.刪除小豬信息 //刪除第一只小豬,小佳 list.remove(0);//與數(shù)組下標(biāo)相對(duì)應(yīng) //刪除指定小豬,小龍 list.remove(xiaolong); //將剩下的小豬信息進(jìn)行輸出 System.out.println("刪除之后還有"+list.size()+"只小豬,\n分別是:"); for(int i=0;i<list.size();i++){ /** * Object get(int index)返回指定索引位置處的元素。取出的元素是Object類型, * 使用前需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換 */ Pig center=(Pig)list.get(i);//所以需要強(qiáng)轉(zhuǎn)為Pig的類型 System.out.println(center.getName()+","+center.getSex()); } System.out.println("*******************************************************"); //5.判斷集合中是否包含指定小豬 if (list.contains(xiaojia)){//使用list.contains()方法進(jìn)行判斷 System.out.println("集合中有小佳"); }else{ System.out.println("集合中沒(méi)有小佳"); } } }
測(cè)試運(yùn)行結(jié)果如下:
三:LinkedList的特有方法:
eg:(代碼示例03)----LinkedList代碼示例:
package JIhekuangjia006.LinkedList; /** * 小豬類 */ public class Pig { private String name; //昵稱 private String sex; //性別 public Pig(String name,String sex){ this.name=name; this.sex=sex; } public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setSex(String sex){ this.sex=sex; } public String getSex(){ return sex; } }
package JIhekuangjia006.LinkedList; import java.util.Iterator; import java.util.LinkedList; /** * 使用LinkedList集合操作數(shù)據(jù) */ public class Test2 { public static void main(String[] args) { //1.存儲(chǔ)小豬信息 Pig xiaojia=new Pig("小佳","母");//索引為0 Pig xiaolong=new Pig("小龍","公");//索引為1 Pig jiajia=new Pig("佳佳","女");//索引為2 Pig longlong=new Pig("龍龍","男");//索引為3(與數(shù)組相同,從0開(kāi)始) //為小豬排序 LinkedList list=new LinkedList(); //直接將元素添加排序 list.add(xiaolong); list.add(longlong); list.addFirst(jiajia);//將佳佳添加到第一個(gè)位置 list.addLast(xiaojia);//將小龍?zhí)砑拥阶詈笠粋€(gè)位置 //list.add(jiajia);//List 接口存儲(chǔ)一組不唯一,有序(插入順序)的對(duì)象 //2.獲得小豬的總數(shù) //通過(guò)list.size()方法獲取元素的個(gè)數(shù) list.size(); System.out.println("小豬的總數(shù)為"+list.size()); //3.逐條打印小豬的信息 //方法一:通過(guò)迭代器Iterator實(shí)現(xiàn)遍歷 Iterator it=list.iterator(); while (it.hasNext()){ Pig center=(Pig)it.next(); System.out.println(center.getName()+","+center.getSex()); } //方法二:for循環(huán)與get()方法配合實(shí)現(xiàn)遍歷 // for(int i=0;i<list.size();i++){ // Pig pig=(Pig)list.get(i); // System.out.println(pig.getName()+","+pig.getSex()); // } System.out.println("************************************************"); //4. //獲取第一只小豬的信息 Pig center=(Pig)list.getFirst(); System.out.println("第一條狗狗信息是:"+center.getName()+","+center.getSex()); //獲取最后一只小豬的信息 Pig center1=(Pig)list.getLast(); System.out.println("最后一條狗狗信息是:"+center1.getName()+","+center1.getSex()); System.out.println("*****************************************************"); //5.刪除第一只小豬和最后一只小豬 list.removeFirst(); list.removeLast(); System.out.println("*****************************************************"); //6.輸出剩下小豬的信息 System.out.println("剩下還有"+list.size()+"只小豬,\n分別是:"); for(int i=0;i<list.size();i++){ Pig pig=(Pig)list.get(i); System.out.println(pig.getName()+","+pig.getSex()); } //7.判斷集合中是否存在小佳 if(list.contains(xiaojia)){ System.out.println("集合中存在小佳"); }else{ System.out.println("集合中不存在小佳"); } } }
測(cè)試運(yùn)行結(jié)果如下:
以上就是區(qū)分Java中的ArrayList和LinkedList的詳細(xì)內(nèi)容,更多關(guān)于Java中ArrayList和LinkedList的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Java動(dòng)態(tài)規(guī)劃篇之線性DP的示例詳解
這篇文章主要通過(guò)幾個(gè)例題為大家詳細(xì)介紹一些Java動(dòng)態(tài)規(guī)劃中的線性DP,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-11-11SpringBoot?Webflux創(chuàng)建TCP/UDP?server并使用handler解析數(shù)據(jù)
這篇文章主要介紹了SpringBoot?Webflux創(chuàng)建TCP/UDP?server并使用handler解析數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02使用Java程序模擬實(shí)現(xiàn)新冠病毒傳染效果
這篇文章主要介紹了用Java程序模擬實(shí)現(xiàn)新冠病毒傳染效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java控制臺(tái)實(shí)現(xiàn)猜拳游戲小游戲
這篇文章主要為大家詳細(xì)介紹了Java控制臺(tái)實(shí)現(xiàn)猜拳游戲小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11SpringCloud中使用webclient(get和post)請(qǐng)求微服務(wù)接口數(shù)據(jù)
在SpringCloud項(xiàng)目中使用WebClient調(diào)用微服務(wù)時(shí),涉及配置WebClient、發(fā)起get和post請(qǐng)求等操作,如請(qǐng)求頭設(shè)置、服務(wù)地址配置、數(shù)據(jù)轉(zhuǎn)換處理、異常處理等,避免在循環(huán)中使用WebClient請(qǐng)求、路徑設(shè)置細(xì)節(jié)以及數(shù)據(jù)返回處理技巧,本文旨在幫助理解和應(yīng)用WebClient進(jìn)行微服務(wù)調(diào)用2024-10-10Springboot+MyBatist實(shí)現(xiàn)前后臺(tái)交互登陸功能方式
這篇文章主要介紹了Springboot+MyBatist實(shí)現(xiàn)前后臺(tái)交互登陸功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java 注解實(shí)現(xiàn)一個(gè)可配置線程池的方法示例
這篇文章主要介紹了java 注解實(shí)現(xiàn)一個(gè)可配置線程池的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01