java集合Collection實(shí)現(xiàn)類解析ArrayList?LinkedList及Vector
前言
平時(shí)開發(fā)經(jīng)常會(huì)用到List等集合操作,在這里做一個(gè)小結(jié)
java集合Collection
java里面集合分為兩大類:List和Set,下面是類圖信息
List實(shí)現(xiàn)類
List的實(shí)現(xiàn)類ArrayList,LinkedList,Vector的特性
有序集合List接口的實(shí)現(xiàn)類LinkedLIst,ArrayList,Vector,Stack
(1)ArrayList是最常用的List實(shí)現(xiàn)類,內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)的,它允許對(duì)元素進(jìn)行快速隨機(jī)訪問(wèn),
當(dāng)數(shù)組大小不滿足時(shí)會(huì)增加存儲(chǔ)能力,將已有數(shù)組數(shù)據(jù)復(fù)制到新的存儲(chǔ)空間中。當(dāng)從ArrayList的中間位置插入或者刪除元素時(shí),
需要對(duì)數(shù)組進(jìn)行拷貝,移動(dòng),代價(jià)比較高。因此,它適合隨即查找和遍歷,不適合頻繁插入和刪除財(cái)操作。
(2)Vector與ArrayList一樣,也是通過(guò)數(shù)組實(shí)現(xiàn)的。不同的是它支持線程的同步,即一時(shí)刻只有一個(gè)線程能夠?qū)慥ector,
避免多線程同時(shí)寫引起的不一致性。但實(shí)現(xiàn)同步需要很高的花費(fèi), 因此,訪問(wèn)它比訪問(wèn)ArrayList慢。
- 2.1 Vector和ArrayList在更多元素添加進(jìn)來(lái)時(shí)會(huì)請(qǐng)求更大的空間。Vector每次請(qǐng)求其大小的雙倍空間,而ArrayList每次對(duì)size增長(zhǎng)50%.
- 2.2 Vector和ArrayList都是用數(shù)組實(shí)現(xiàn)的,所以,在添加和插入時(shí),最好從表尾操作,而不要從中間或者表頭開始,以避免數(shù)組移動(dòng)引起的開銷!
(3)LinkedList是用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的,很適合數(shù)據(jù)的動(dòng)態(tài)插入和刪除,隨即訪問(wèn)和遍歷速度比較慢。另外,由于它實(shí)現(xiàn)了接口Deque,它還提供了List沒有定義的方法,專門用于操作表頭和表尾元素。
(4)可以為每個(gè)List生成ListIterator,支持雙向遍歷List,而且能夠在ListIterator位置插入和刪除元素。
(5)Stack堆棧類繼承Vector,它總是對(duì)列表的尾部數(shù)據(jù)進(jìn)行操作,采用了先進(jìn)后出的策略,自定義了push(),peek(),pop(),empty(),search()幾個(gè)方法。
Set實(shí)現(xiàn)類
Set的實(shí)現(xiàn)類HashSet,LinkedHashSet,TreeSet的特性
無(wú)序集合Set的實(shí)現(xiàn)類HashSet,LinkedHashSet,TreeSet
(1)Set不允許存放相同的元素,判斷的依據(jù)是根據(jù)存放元素的equals方法和hashCode來(lái)判斷的,如有需要可以重寫這兩個(gè)方法
(2) HashSet:基于HashMap實(shí)現(xiàn),哈希表是通過(guò)使用稱為散列法的機(jī)制來(lái)存儲(chǔ)信息的,元素并沒有以某種特定順序來(lái)存放
(3)LinkedHashSet:基于LinkedHashMap實(shí)現(xiàn),以元素插入的順序來(lái)維護(hù)集合的鏈接表,允許以插入的順序在集合中迭代。
LinkedHashSet在迭代訪問(wèn)Set中的全部元素時(shí),性能比HashSet好,但是插入時(shí)性能稍微遜色于HashSet
(4)TreeSet:基于TreeMap實(shí)現(xiàn),Set里唯一現(xiàn)實(shí)了SortedSet接口的實(shí)現(xiàn)類,默認(rèn)按元素的實(shí)現(xiàn)接口Comparable的方法CompareTo(Object obj)升序,
如有需要,元素可實(shí)現(xiàn)Comparable
代碼實(shí)例
/** * @author kl by 2016/4/5 * @boke www.kailing.pub */ public class CollectionTest { public void initCollection(Collection collection){ collection.add(1); collection.add(2); collection.add(3); collection.add(4); collection.add(5); collection.add(6); } @Test public void linkListTest(){ LinkedList list = new LinkedList(); //初始化數(shù)據(jù) initCollection(list); //迭代方式一 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).toString()); } System.out.println("-------------------------迭代方式一華麗分割線----------------------------"); //迭代方式二 for (Object o : list) { System.out.println(o.toString()); //list.add(3);//這樣寫直接拋異常,有這種業(yè)務(wù)需要的直接用ListIterator迭代 } System.out.println("-------------------------迭代方式二華麗分割線----------------------------"); //迭代方式三 封裝了Iterator ListIterator listIterator = list.listIterator(); while (listIterator.hasNext()) { /** * 在迭代的同時(shí)可以操作當(dāng)前的listIterator,對(duì)集合做增刪改的操作,其他的迭代方式在迭代的時(shí)候不能直接操作集合 * ListIterator沒有直接更新的方法,通過(guò)刪除和添加來(lái)達(dá)到更新的目的 */ Object value=listIterator.next().toString();// if (value.equals("3")){ listIterator.remove();//刪除某個(gè)元素 listIterator.add(0);//添加某個(gè)元素 }else{ System.out.println(value); } } System.out.println("-------------------------迭代方式三華麗分割線----------------------------"); //迭代方式四 ps:java.util.Iterator Iterator iterable = list.iterator(); while (iterable.hasNext()) { System.out.println(iterable.next()); } System.out.println("-------------------------迭代方式四華麗分割線----------------------------"); System.out.println("是否存在 " + list.contains(9)); //使用indexOf函數(shù)現(xiàn)實(shí) System.out.println("在集合的哪個(gè)位置 " + list.indexOf(3)); //不存在返回-1 System.out.println("在集合的哪個(gè)位置 " + list.lastIndexOf(3));//從集合的最后索引往前找 list.remove(0);//移除指定下標(biāo)元素 Object str[] =list.toArray();//轉(zhuǎn)換成數(shù)組,感覺一般不會(huì)有這個(gè)操作 List list1=list.subList(2,6);//分割一個(gè)集合 for (Object o : list1) { System.out.println("list1 "+o.toString()); //list.add(3);//這樣寫直接拋異常,有這種業(yè)務(wù)需要的直接用ListIterator迭代 } list.removeFirst(); list1= (List) list.clone();//復(fù)制一份list,和直接list1=list的不同之處在于對(duì)list操作不影響list1 /*以上操作迭代LinkedList,ArrayList,Vector都可用*/ /*以下操作方式是LinkedList特有的,是實(shí)現(xiàn)Deque中的方法*/ list.addFirst(10); list.addLast(10); System.out.println("鏈表頭數(shù)據(jù) "+list.getFirst().toString()); System.out.println("鏈表尾數(shù)據(jù) "+list.getLast().toString()); list.removeFirst();//移除第一個(gè)元素 list.offer(11);//方法內(nèi)部使用了add方法 list.removeLast();//移除最后一個(gè)元素 } @Test public void StackTest(){ Stack list=new Stack(); initCollection(list); System.out.println("pop :"+list.pop());// pop() 移除棧頂?shù)闹?,并返回移除的Obj System.out.println("push :"+list.push(5));// push() 壓棧,并返回Obj System.out.println("peek :"+list.peek());// 取棧頂?shù)闹? System.out.println("empty :"+list.empty());// 判空方法,是否為空棧 System.out.println("search :"+list.search(99));//查找元素的位置,不存在返回-1,可以用來(lái)判斷是否存在某個(gè)值 Enumeration en= list.elements(); //Vector特有的迭代方式 while (en.hasMoreElements()){ if(list.empty()){ }else System.out.println(en.nextElement()); } } @Test public void arrayListTest(){ ArrayList list=new ArrayList(); initCollection(list); for(Object o:list){ System.out.println(o.toString()); } } @Test public void VectorTest(){ Vector v=new Vector(); Enumeration en= v.elements(); //Vector特有的迭代方式 while (en.hasMoreElements()){ System.out.println(en.nextElement()); } } @Test public void SetTest(){ HashSet hs = new HashSet(); initSet(hs); System.out.println("HashSet 順序:"+hs); LinkedHashSet lhs = new LinkedHashSet(); initSet(lhs); System.out.println("LinkedHashSet 順序:"+lhs); TreeSet ts = new TreeSet(); initSet(ts); System.out.println("TreeSet 順序:"+ts); for(Object s:hs){ System.out.println("value:"+s); } } public void initSet(Set set){ set.add("G"); set.add("B"); set.add("A"); set.add("E"); set.add("D"); set.add("C"); set.add("F"); }
以上就是java集合Collection實(shí)現(xiàn)類解析ArrayList LinkedList及Vector的詳細(xì)內(nèi)容,更多關(guān)于Collection實(shí)現(xiàn)類ArrayList LinkedList Vector的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java結(jié)構(gòu)型設(shè)計(jì)模式之享元模式示例詳解
享元模式(FlyWeight?Pattern),也叫蠅量模式,運(yùn)用共享技術(shù),有效的支持大量細(xì)粒度的對(duì)象,享元模式就是池技術(shù)的重要實(shí)現(xiàn)方式。本文將通過(guò)示例詳細(xì)講解享元模式,感興趣的可以了解一下2022-09-09SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置
這篇文章主要介紹了SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼
這篇文章主要介紹了java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Java?NIO?Buffer實(shí)現(xiàn)原理詳解
本篇文章主要對(duì)NIO核心三件套:緩沖區(qū)(Buffer)、選擇器?(Selector)和通道(Channel),其中之一的緩沖區(qū)Buffer實(shí)現(xiàn)原理的學(xué)習(xí)總結(jié)。感興趣的小伙伴可以了解一下2021-11-11SpringMVC視圖轉(zhuǎn)發(fā)重定向區(qū)別及控制器詳解
這篇文章主要為大家介紹了SpringMVC視圖轉(zhuǎn)發(fā)重定向區(qū)別及控制器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Java使用Fastjson進(jìn)行JSON數(shù)據(jù)操作教程詳解
Fastjson?是一個(gè)?Java?庫(kù),可以用來(lái)將?Java?對(duì)象轉(zhuǎn)換為它們的?JSON?表示,本文主要為大家詳細(xì)介紹了Java如何使用Fastjson進(jìn)行JSON數(shù)據(jù)操作,需要的可以參考下2023-12-12mybatis?mapper.xml?注釋帶參數(shù)的坑及解決
這篇文章主要介紹了mybatis?mapper.xml?注釋帶參數(shù)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java中EasyPoi導(dǎo)出復(fù)雜合并單元格的方法
這篇文章主要介紹了Java中EasyPoi導(dǎo)出復(fù)雜合并單元格的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Java求素?cái)?shù)和最大公約數(shù)的簡(jiǎn)單代碼示例
這篇文章主要介紹了Java求素?cái)?shù)和最大公約數(shù)的簡(jiǎn)單代碼示例,其中作者創(chuàng)建的Fraction類可以用來(lái)進(jìn)行各種分?jǐn)?shù)運(yùn)算,需要的朋友可以參考下2015-09-09SpringCloud Feign 服務(wù)調(diào)用的實(shí)現(xiàn)
Feign是一個(gè)聲明性web服務(wù)客戶端。本文記錄多個(gè)服務(wù)之間使用Feign調(diào)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01