最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的List集合框架之Vector詳細(xì)解析

 更新時(shí)間:2023年11月16日 09:53:25   作者:進(jìn)擊的貓  
這篇文章主要介紹了Java的List集合框架之Vector詳細(xì)解析,List接口繼承Collection,Collection繼承于Iterable,List接口實(shí)現(xiàn)類分為Vector、ArrayList、LinkedList,Vector底層是一個(gè)Object數(shù)組,需要的朋友可以參考下

(一)List子父層級(jí):

Vector繼承關(guān)系

  • List接口繼承Collection,Collection繼承于Iterable;
  • List接口實(shí)現(xiàn)類分為:Vector、ArrayList、LinkedList;

(二)List實(shí)現(xiàn)類——Vector

1、Vector實(shí)現(xiàn)類

(1)Vector底層是一個(gè)Object數(shù)組,protected Object[] elementData;

(2)Vector中的所有涉及到Object數(shù)組的均是會(huì)加synchronized,列舉常見方法:構(gòu)造方法、add、remove、get、set等

(3)Vector中的默認(rèn)容量為10,且擴(kuò)容默認(rèn)為當(dāng)前容量翻倍(直接相加或者構(gòu)造方法中指定擴(kuò)容大小)。

2、常見源碼:

(1)構(gòu)造方法:

//無參構(gòu)造
 public Vector() {
        this(10);//默認(rèn)大小為10
    }

//初始化指定大小的有參構(gòu)造方法
        public Vector(int initialCapacity) {
            this(initialCapacity, 0);
        }

//指定擴(kuò)容大小和初始值的有參構(gòu)造   
public Vector(int initialCapacity, int capacityIncrement) {
    super();//父類無參構(gòu)造
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];//實(shí)例化存儲(chǔ)數(shù)組
    this.capacityIncrement = capacityIncrement;//設(shè)置自動(dòng)擴(kuò)容大小
}

(2)add方法:

/*
* 此處列舉的直接末尾添加add方法,還有指定位置添加insertElementAt方法添加,操作數(shù)組均會(huì)在方法上添加synchronized鎖
**/
public synchronized boolean add(E e) {
    modCount++;//操作次數(shù)
    ensureCapacityHelper(elementCount + 1);//是否需要擴(kuò)容
    elementData[elementCount++] = e;//存儲(chǔ)數(shù)據(jù)
    return true;
}
//擴(kuò)容判定
private void ensureCapacityHelper(int minCapacity) {
 if (minCapacity - elementData.length > 0)//判定是否需要擴(kuò)容,當(dāng)前存入值已大于數(shù)組大小
     grow(minCapacity);//調(diào)用擴(kuò)容方法
}

//數(shù)組最大值,使用Integer最大值2147483648-8,因數(shù)組需要存自身的元數(shù)據(jù)占用8位(Class\Lock\Flag\Size)
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

//擴(kuò)容方法
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;//當(dāng)前數(shù)組大小
    //根據(jù)構(gòu)造函數(shù)判定擴(kuò)容值,未指定則采用翻一倍方式擴(kuò)容
    int newCapacity = oldCapacity + ((capacityIncrement > 0)?capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)//判定新擴(kuò)容值是否滿足當(dāng)前存入后的數(shù)組大小
        newCapacity = minCapacity;//擴(kuò)容大小不滿足,則直接擴(kuò)容到滿足存入后的數(shù)組大小
    if (newCapacity - MAX_ARRAY_SIZE > 0)//判定擴(kuò)容后的值是否大于數(shù)組最大值
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);//數(shù)組遷移復(fù)制
}
//存儲(chǔ)最大值判定,超出限制則默認(rèn)使用最大值
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) //越界
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE)?Integer.MAX_VALUE:MAX_ARRAY_SIZE;//返回最大值或者數(shù)組最大值
}

(3)remove方法:

/*
* 此處列舉的返回boolean值的刪除方法,還有直接刪除指定索引的remove,
* 它直接在方法上添加synchronized鎖,邏輯與具體刪除一致
**/
public boolean remove(Object o) {
    return removeElement(o);//調(diào)用具體刪除方法
}

public synchronized boolean removeElement(Object obj) {
    modCount++;//操作次數(shù)
    int i = indexOf(obj);//獲取obj在數(shù)組中存儲(chǔ)的下標(biāo),防止數(shù)組越界
    if (i >= 0) {
        removeElementAt(i);//調(diào)用刪除方法
        return true;
    }
    return false;
}
//索引尋找
public int indexOf(Object o) {
    return indexOf(o, 0);//傳入需要比對(duì)值和數(shù)組首標(biāo)
}
//遍歷數(shù)組尋找指定值(找尋下標(biāo),防止線程不安全,加synchronized)
public synchronized int indexOf(Object o, int index) {
    if (o == null) {//判定傳入是否為空
        for (int i = index ; i < elementCount ; i++)
            if (elementData[i]==null)
                return i;//返回?cái)?shù)組下標(biāo)第一個(gè)為null的索引
    } else {
        for (int i = index ; i < elementCount ; i++)
            if (o.equals(elementData[i]))//判定需要?jiǎng)h除值與數(shù)組值是否相等,相等則返回第一個(gè)相等的下標(biāo)
                return i;//返回索引值
    }
    return -1;
}
//根據(jù)索引對(duì)指定下標(biāo)進(jìn)行刪除(與存儲(chǔ)數(shù)組進(jìn)行交互,添加synchronized鎖)
public synchronized void removeElementAt(int index) {
    modCount++;//操作次數(shù)
    if (index >= elementCount) {//越界判定
        throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                 elementCount);
    }else if (index < 0) {//越界判定
        throw new ArrayIndexOutOfBoundsException(index);
    }
    int j = elementCount - index - 1;//計(jì)算需要被遷移的數(shù)組成員數(shù)量
    if (j > 0) {
        //使用系統(tǒng)類提供的數(shù)組復(fù)制方法進(jìn)行遷移復(fù)制
        //參數(shù)說明:被復(fù)制的數(shù)組,被復(fù)制的數(shù)組起點(diǎn)下標(biāo),目標(biāo)數(shù)組(復(fù)制到的新數(shù)組),目標(biāo)數(shù)組被復(fù)制的起點(diǎn)下標(biāo),需要復(fù)制的大小
        System.arraycopy(elementData, index + 1, elementData, index, j);
    }
    elementCount--;//成員數(shù)量減1
    //將原來存儲(chǔ)有值的最后一位值置為空,便于GC回收工作,提高內(nèi)存使用率
    elementData[elementCount] = null;
}

(4)get方法:

public synchronized E get(int index) {
     if (index >= elementCount)//越界控制
         throw new ArrayIndexOutOfBoundsException(index);
     return elementData(index);
 }
 //返回指定數(shù)組值
 E elementData(int index) {
     return (E) elementData[index];
 }

(5)set方法:

public synchronized E set(int index, E element) {
   if (index >= elementCount)//越界控制
        throw new ArrayIndexOutOfBoundsException(index);
    E oldValue = elementData(index);//獲取索引已存在的值或者null
    elementData[index] = element;//設(shè)置新值
    return oldValue;//返回設(shè)置之前的索引數(shù)組值
}

3、總結(jié)

(1)Vector是線程安全的,每個(gè)涉及到存儲(chǔ)數(shù)據(jù)的方法都添加synchronized鎖,性能相對(duì)會(huì)較低;

(2)Vector默認(rèn)的存儲(chǔ)大小為10,不指定自動(dòng)擴(kuò)容大小,則默認(rèn)使用當(dāng)前數(shù)組大小進(jìn)行自加擴(kuò)容(直接相加或者構(gòu)造方法中指定擴(kuò)容大?。?      

到此這篇關(guān)于Java的List集合框架之Vector詳細(xì)解析的文章就介紹到這了,更多相關(guān)List集合框架之Vector內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法

    Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法

    很多時(shí)候在javaweb項(xiàng)目中我們需要用到Socket通信來實(shí)現(xiàn)功能,在web中使用Socket我們需要建立一個(gè)監(jiān)聽程序,在程序啟動(dòng)時(shí),啟動(dòng)socket監(jiān)聽。接下來通過本文給大家介紹Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法,感興趣的朋友一起學(xué)習(xí)
    2016-04-04
  • Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列

    Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列

    這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列,工作中遇到項(xiàng)目使用Disruptor做消息隊(duì)列,對(duì)你沒看錯(cuò),不是Kafka,也不是rabbitmq。Disruptor有個(gè)最大的優(yōu)點(diǎn)就是快,還有一點(diǎn)它是開源的哦,下面做個(gè)簡(jiǎn)單的記錄
    2022-06-06
  • Java開發(fā)人員最常犯的5個(gè)錯(cuò)誤總結(jié)

    Java開發(fā)人員最常犯的5個(gè)錯(cuò)誤總結(jié)

    作為一名java開發(fā)程序員,不知道大家有沒有遇到過一些匪夷所思的bug。這些錯(cuò)誤通常需要您幾個(gè)小時(shí)才能解決。今天,小編總結(jié)一些常見的編碼錯(cuò)誤,然后給出解決方案。希望大家在日常編碼中能夠避免這樣的問題
    2022-12-12
  • SpringBoot加載bean的八種方式總結(jié)

    SpringBoot加載bean的八種方式總結(jié)

    springboot難免要用到bean,但這些bean如何導(dǎo)入,對(duì)于初學(xué)者時(shí)間頭疼的事,下面這篇文章主要給大家介紹了關(guān)于SpringBoot加載bean的八種方式,需要的朋友可以參考下
    2022-10-10
  • Spring MVC InitBinder驗(yàn)證方法

    Spring MVC InitBinder驗(yàn)證方法

    這篇文章主要介紹了Spring MVC InitBinder驗(yàn)證方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 詳解SpringBoot中的統(tǒng)一功能處理的實(shí)現(xiàn)

    詳解SpringBoot中的統(tǒng)一功能處理的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)統(tǒng)一功能處理,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定借鑒價(jià)值,需要的可以參考一下
    2023-01-01
  • java web圖片上傳和文件上傳實(shí)例

    java web圖片上傳和文件上傳實(shí)例

    本篇文章主要介紹了java web圖片上傳和文件上傳實(shí)例,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • 使用maven對(duì)springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案

    使用maven對(duì)springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案

    springboot項(xiàng)目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個(gè)插件默認(rèn)情況下,會(huì)把所有的依賴包全部壓縮到一個(gè)jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下
    2024-02-02
  • Java獲取文件ContentType案例

    Java獲取文件ContentType案例

    這篇文章主要介紹了Java獲取文件ContentType案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 使用Fastjson進(jìn)行JSON生成與解析的新手指南

    使用Fastjson進(jìn)行JSON生成與解析的新手指南

    Fastjson是阿里巴巴開源的高性能 JSON 庫(kù),適用于 Java 對(duì)象的序列化和反序列化,本文將詳細(xì)介紹一下如何使用Fastjson進(jìn)行json的生成與解析吧
    2025-04-04

最新評(píng)論

沈丘县| 广东省| 广州市| 广灵县| 西吉县| 漳州市| 阿拉尔市| 酉阳| 洛浦县| 崇左市| 隆安县| 古浪县| 临清市| 赤城县| 晴隆县| 抚顺市| 三江| 改则县| 临洮县| 邹城市| 柳林县| 山东省| 吴堡县| 石泉县| 信阳市| 临沧市| 长葛市| 泗阳县| 迁西县| 莎车县| 广东省| 临西县| 廉江市| 元朗区| 呼和浩特市| 凤城市| 克东县| 德昌县| 枣阳市| 昆明市| 汕头市|