欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java集合Collection實(shí)現(xiàn)類解析ArrayList?LinkedList及Vector

 更新時(shí)間:2022年03月08日 11:38:03   作者:kl  
這篇文章主要為大家介紹了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)部是通過數(shù)組實(shí)現(xiàn)的,它允許對(duì)元素進(jìn)行快速隨機(jī)訪問,

當(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一樣,也是通過數(shù)組實(shí)現(xiàn)的。不同的是它支持線程的同步,即一時(shí)刻只有一個(gè)線程能夠?qū)慥ector,
 避免多線程同時(shí)寫引起的不一致性。但實(shí)現(xiàn)同步需要很高的花費(fèi), 因此,訪問它比訪問ArrayList慢。

  • 2.1 Vector和ArrayList在更多元素添加進(jìn)來時(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)插入和刪除,隨即訪問和遍歷速度比較慢。另外,由于它實(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的特性

無序集合Set的實(shí)現(xiàn)類HashSet,LinkedHashSet,TreeSet

(1)Set不允許存放相同的元素,判斷的依據(jù)是根據(jù)存放元素的equals方法和hashCode來判斷的,如有需要可以重寫這兩個(gè)方法

(2) HashSet:基于HashMap實(shí)現(xiàn),哈希表是通過使用稱為散列法的機(jī)制來存儲(chǔ)信息的,元素并沒有以某種特定順序來存放

(3)LinkedHashSet:基于LinkedHashMap實(shí)現(xiàn),以元素插入的順序來維護(hù)集合的鏈接表,允許以插入的順序在集合中迭代。

LinkedHashSet在迭代訪問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沒有直接更新的方法,通過刪除和添加來達(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,可以用來判斷是否存在某個(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)文章

  • JavaWeb詳細(xì)講述Cookie和Session的概念

    JavaWeb詳細(xì)講述Cookie和Session的概念

    web開發(fā)階段我們主要是瀏覽器和服務(wù)器之間來進(jìn)行交互。瀏覽器和服務(wù)器之間的交互就像人和人之間進(jìn)行交流一樣,但是對(duì)于機(jī)器來說,在一次請(qǐng)求之間只是會(huì)攜帶著本次請(qǐng)求的數(shù)據(jù)的,但是可能多次請(qǐng)求之間是會(huì)有聯(lián)系的,所以提供了會(huì)話機(jī)制
    2022-06-06
  • Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    這篇文章主要為大家介紹了Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java多線程之原子類解析

    Java多線程之原子類解析

    這篇文章主要介紹了Java多線程之原子類解析,Java原子類是一種多線程編程中常用的工具,用于實(shí)現(xiàn)線程安全的操作,它們提供了一種原子性操作的機(jī)制,確保多個(gè)線程同時(shí)訪問共享變量時(shí)的數(shù)據(jù)一致性,需要的朋友可以參考下
    2023-10-10
  • Spring boot啟動(dòng)原理及相關(guān)組件整理

    Spring boot啟動(dòng)原理及相關(guān)組件整理

    這篇文章主要介紹了Spring boot啟動(dòng)原理及相關(guān)組件整理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • 詳解java配置文件的路徑問題

    詳解java配置文件的路徑問題

    這篇文章主要介紹了詳解java配置文件的路徑問題的相關(guān)資料,這里對(duì)絕對(duì)路徑及相對(duì)路徑和classpath 類文件路徑進(jìn)行詳細(xì)介紹,需要的朋友可以參考下
    2017-07-07
  • SpringBoot?Starter自定義全局加解密組件的詳細(xì)流程

    SpringBoot?Starter自定義全局加解密組件的詳細(xì)流程

    SpringBoot?Starter作用將一組相關(guān)的依賴打包,簡(jiǎn)化項(xiàng)目的配置和初始化過程,通過特定的Starter開發(fā)者可以快速的實(shí)現(xiàn)特定功能模塊的開發(fā)和擴(kuò)展,本文給大家介紹了SpringBoot?Starter自定義全局加解密組件的詳細(xì)流程,需要的朋友可以參考下
    2024-02-02
  • Java spring定時(shí)任務(wù)詳解

    Java spring定時(shí)任務(wù)詳解

    這篇文章主要為大家詳細(xì)介紹了Spring定時(shí)任務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-10-10
  • Java使用JSONPath解析JSON完整內(nèi)容詳解

    Java使用JSONPath解析JSON完整內(nèi)容詳解

    這篇文章主要介紹了Java使用JSONPath解析JSON完整內(nèi)容詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Java 停止線程需要注意的地方

    Java 停止線程需要注意的地方

    這篇文章主要介紹了Java 停止線程需要注意的地方,幫助大家更好的理解和學(xué)習(xí)Java線程的相關(guān)資料,感興趣的朋友可以了解下
    2020-09-09
  • JDBC如何訪問MySQL數(shù)據(jù)庫,并增刪查改

    JDBC如何訪問MySQL數(shù)據(jù)庫,并增刪查改

    這篇文章主要介紹了JDBC如何訪問MySQL數(shù)據(jù)庫,幫助大家更好的理解和學(xué)習(xí)java與MySQL,感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論