區(qū)分Java中的ArrayList和LinkedList
一:ArrayList和LinkedList的大致區(qū)別如下:
1.ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),ArrayList實現(xiàn)了長度可變的數(shù)組,在內(nèi)存中分配連續(xù)的空間。遍歷元素和隨機訪問元素的效率比較高
2.LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu), 插入、刪除元素時效率比較高 故:【插入、刪除操作頻繁時,可使用LinkedList來提高效率】LinkedList提供對頭部和尾部元素進行添加和刪除操作的方法,插入/刪除第一個和最后一個效率比較高;
3:ArrayList和LinkedList都是List接口的實現(xiàn),都存儲一組不唯一,有序(插入順序)的對象, 對元素進行添加、刪除等操作[ 即:List的性質(zhì)]
4.對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。
5.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。
6:LinkedList比ArrayList更占內(nèi)存
eg:(代碼示例01)----ArrayList與LinkedLis的數(shù)據(jù)添加和查找耗時對比
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ù)所需時間 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ù)所需時間 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+'條耗時:'+timeList(new ArrayList())); System.out.println('LinkedList添加'+N+'條耗時:'+timeList(new LinkedList())); List list1=addList(new ArrayList<>()); List list2=addList(new LinkedList<>()); System.out.println('ArrayList查找'+N+'條耗時:'+readList(list1)); System.out.println('LinkedList查找'+N+'條耗時:'+readList(list2)); }
從以上結(jié)果,我i們可以看出 ArrayList更適合讀取數(shù)據(jù),linkedList更多的時候添加或刪除數(shù)據(jù)。
ArrayList:內(nèi)部是使用可??長數(shù)組實現(xiàn)的,所以是用get和set方法是花費少數(shù)時間的,但是如果插入元素和刪除元素,除非插入和刪除的位置都在表末尾,否則代碼開銷會很大,因為里面需要數(shù)組的移動。
LinkedList:是使用雙鏈表實現(xiàn)的,所以get會非常消耗資源,除非位置離頭部很近。但是插入和刪除元素花費少數(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集合進行操作數(shù)據(jù) */public class Test1 { public static void main(String[] args) { //1.存儲小豬信息 Pig xiaojia=new Pig('小佳','母');//索引為0 Pig xiaolong=new Pig('小龍','公');//索引為1 Pig jiajia=new Pig('佳佳','女');//索引為2 Pig longlong=new Pig('龍龍','男');//索引為3(與數(shù)組相同,從0開始) //為小豬排序 List list=new ArrayList(); //直接將元素添加排序 list.add(xiaojia); list.add(jiajia); list.add(xiaolong); //將龍龍?zhí)砑拥剿饕秊?的位置 list.add(2,longlong); //list.add(jiajia);//List 接口存儲一組不唯一,有序(插入順序)的對象 //2.獲得小豬的總數(shù) //通過list.size()方法獲取元素的個數(shù) list.size(); System.out.println('小豬的總數(shù)為'+list.size()); //3.逐條打印小豬信息 //方法一:for循環(huán)與get()方法配合實現(xiàn)遍歷 for(int i=0;i<list.size();i++){ Pig center=(Pig)list.get(i);//因為list.get()的返回值為Object的類型,所以需要強轉(zhuǎn)為Pig的類型 System.out.println(center.getName()+','+center.getSex()); } //方法二:通過迭代器Iterator實現(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ù)組下標相對應(yīng) //刪除指定小豬,小龍 list.remove(xiaolong); //將剩下的小豬信息進行輸出 System.out.println('刪除之后還有'+list.size()+'只小豬,n分別是:'); for(int i=0;i<list.size();i++){ /** * Object get(int index)返回指定索引位置處的元素。取出的元素是Object類型, * 使用前需要進行強制類型轉(zhuǎn)換 */ Pig center=(Pig)list.get(i);//所以需要強轉(zhuǎn)為Pig的類型 System.out.println(center.getName()+','+center.getSex()); } System.out.println('*******************************************************'); //5.判斷集合中是否包含指定小豬 if (list.contains(xiaojia)){//使用list.contains()方法進行判斷 System.out.println('集合中有小佳'); }else{ System.out.println('集合中沒有小佳'); } }}
測試運行結(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.存儲小豬信息 Pig xiaojia=new Pig('小佳','母');//索引為0 Pig xiaolong=new Pig('小龍','公');//索引為1 Pig jiajia=new Pig('佳佳','女');//索引為2 Pig longlong=new Pig('龍龍','男');//索引為3(與數(shù)組相同,從0開始) //為小豬排序 LinkedList list=new LinkedList(); //直接將元素添加排序 list.add(xiaolong); list.add(longlong); list.addFirst(jiajia);//將佳佳添加到第一個位置 list.addLast(xiaojia);//將小龍?zhí)砑拥阶詈笠粋€位置 //list.add(jiajia);//List 接口存儲一組不唯一,有序(插入順序)的對象 //2.獲得小豬的總數(shù) //通過list.size()方法獲取元素的個數(shù) list.size(); System.out.println('小豬的總數(shù)為'+list.size()); //3.逐條打印小豬的信息 //方法一:通過迭代器Iterator實現(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()方法配合實現(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('集合中不存在小佳'); } }}
測試運行結(jié)果如下:
以上就是區(qū)分Java中的ArrayList和LinkedList的詳細內(nèi)容,更多關(guān)于Java中ArrayList和LinkedList的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. pip已經(jīng)安裝好第三方庫但pycharm中import時還是標紅的解決方案2. 關(guān)于Mysql-connector-java驅(qū)動版本問題總結(jié)3. CSS自定義滾動條樣式案例詳解4. 詳解CSS偽元素的妙用單標簽之美5. 將properties文件的配置設(shè)置為整個Web應(yīng)用的全局變量實現(xiàn)方法6. Ajax實現(xiàn)表格中信息不刷新頁面進行更新數(shù)據(jù)7. HTML <!DOCTYPE> 標簽8. SpringBoot+Shiro+LayUI權(quán)限管理系統(tǒng)項目源碼9. ajax post下載flask文件流以及中文文件名問題10. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法
