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

java  Vector和ArrayList的分析及比較

 更新時(shí)間:2016年11月28日 09:40:52   投稿:lqh  
這篇文章主要介紹了java Vector和ArrayList的分析及比較的相關(guān)資料,Vector是多線程安全的,而ArrayList不是,本文主要做對(duì)比對(duì)這兩個(gè)方法,需要的朋友可以參考下

 java Vector和ArrayList 比較

今天研究了一下Vector和ArrayList的源碼,又加深了對(duì)這兩個(gè)類(lèi)的理解。

List接口下一共實(shí)現(xiàn)了三個(gè)類(lèi):ArrayList,Vector,LinkedList。LinkedList就不多說(shuō)了,它一般主要用在保持?jǐn)?shù)據(jù)的插入順序的時(shí)候。

ArrayList和Vector都是用數(shù)組實(shí)現(xiàn)的,主要有這么三個(gè)區(qū)別:

1、Vector是多線程安全的,而ArrayList不是,這個(gè)可以從源碼中看出,Vector類(lèi)中的方法很多有synchronized進(jìn)行修飾,這樣就導(dǎo)致了Vector在效率上無(wú)法與ArrayList相比;
2、兩個(gè)都是采用的線性連續(xù)空間存儲(chǔ)元素,但是當(dāng)空間不足的時(shí)候,兩個(gè)類(lèi)的增加方式是不同的,很多網(wǎng)友說(shuō)Vector增加原來(lái)空間的一倍,ArrayList增加原來(lái)空間的50%,其實(shí)也差不多是這個(gè)意思,不過(guò)還有一點(diǎn)點(diǎn)問(wèn)題可以從源碼中看出,一會(huì)兒從源碼中分析。
3、Vector可以設(shè)置增長(zhǎng)因子,而ArrayList不可以,最開(kāi)始看這個(gè)的時(shí)候,我沒(méi)理解什么是增量因子,不過(guò)通過(guò)對(duì)比一下兩個(gè)源碼理解了這個(gè),先看看兩個(gè)類(lèi)的構(gòu)造方法:

ArrayList有三個(gè)構(gòu)造方法:分別是

public ArrayList(int initialCapacity)//構(gòu)造一個(gè)具有指定初始容量的空列表。 
public ArrayList()//構(gòu)造一個(gè)初始容量為10的空列表。 
public ArrayList(Collection<? extends E> c)//構(gòu)造一個(gè)包含指定 collection 的元素的列表 

Vector有四個(gè)構(gòu)造方法:

public Vector()//使用指定的初始容量和等于零的容量增量構(gòu)造一個(gè)空向量。 
public Vector(int initialCapacity)//構(gòu)造一個(gè)空向量,使其內(nèi)部數(shù)據(jù)數(shù)組的大小,其標(biāo)準(zhǔn)容量增量為零。 
public Vector(Collection<? extends E> c)//構(gòu)造一個(gè)包含指定 collection 中的元素的向量 
public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量構(gòu)造一個(gè)空的向量 

Vector比Arraylist多一個(gè)構(gòu)造方法,沒(méi)錯(cuò)就是public Vector(int initialCapacity,int capacityIncrement)這個(gè)構(gòu)造方法,capacityIncrement就是容量增長(zhǎng),即前面所說(shuō)的增長(zhǎng)因子,ArrayList中是沒(méi)有的。

再貼出兩個(gè)類(lèi)的添加源碼分析下(jdk1.7版本):

//ArrayList類(lèi)的添加源碼: 
  public boolean add(E e) { 
    ensureCapacityInternal(size + 1); // Increments modCount!! 
    elementData[size++] = e; 
    return true; 
  } 
  private void ensureCapacityInternal(int minCapacity) { 
    modCount++; 
    // overflow-conscious code 
    //如果添加一個(gè)元素之后,新容器的大小大于容器的容量,那么就無(wú)法存值了,需要擴(kuò)充空間 
    if (minCapacity - elementData.length > 0) 
      grow(minCapacity); 
  } 
  private void grow(int minCapacity) { 
    // overflow-conscious code 
    int oldCapacity = elementData.length; 
    int newCapacity = oldCapacity + (oldCapacity >> 1); //擴(kuò)充的空間增加原來(lái)的50%(即是原來(lái)的1.5倍) 
    if (newCapacity - minCapacity < 0) //如果容器擴(kuò)容之后還是不夠,那么干脆直接將minCapacity設(shè)為容器的大小 
      newCapacity = minCapacity; 
    if (newCapacity - MAX_ARRAY_SIZE > 0) //如果擴(kuò)充的容器太大了的話,那么就執(zhí)行hugeCapacity 
      newCapacity = hugeCapacity(minCapacity); 
    // minCapacity is usually close to size, so this is a win: 
    elementData = Arrays.copyOf(elementData, newCapacity); 
  } 

Vector類(lèi)的添加源碼:  

  public synchronized boolean add(E e) { 
    modCount++; 
    ensureCapacityHelper(elementCount + 1); 
    elementData[elementCount++] = e; 
    return true; 
  } 
  private void ensureCapacityHelper(int minCapacity) { 
    // overflow-conscious code 
    if (minCapacity - elementData.length > 0) 
      grow(minCapacity); 
  } 
  private void grow(int minCapacity) { 
    // overflow-conscious code 
    int oldCapacity = elementData.length; 
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ? 
                     capacityIncrement : oldCapacity); 
    /** 
    這個(gè)擴(kuò)容需要做個(gè)判斷:如果容量增量初始化的不是0,即使用的public Vector(int initialCapacity,int capacityIncrement)構(gòu)造方法進(jìn)行的初始化,那么擴(kuò)容的容量是(oldCapacity+capacityIncrement),就是原來(lái)的容量加上容量增量的值;如果沒(méi)有設(shè)置容量增量,那么擴(kuò)容后的容量就是(oldCapacity+oldCapacity),就是原來(lái)容量的二倍。 
    **/ 
    if (newCapacity - minCapacity < 0) 
      newCapacity = minCapacity; 
    if (newCapacity - MAX_ARRAY_SIZE > 0) 
      newCapacity = hugeCapacity(minCapacity); 
    elementData = Arrays.copyOf(elementData, newCapacity); 
  } 

通過(guò)分析,現(xiàn)在應(yīng)該可以理解了吧!

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Java怎么獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間源碼詳解(超詳細(xì)!)

    Java怎么獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間源碼詳解(超詳細(xì)!)

    有的時(shí)候,我們需要查看某一段代碼的性能如何,最為簡(jiǎn)單的方式,可以通過(guò)計(jì)算該段代碼執(zhí)行的耗時(shí),來(lái)進(jìn)行簡(jiǎn)單的判斷,這篇文章主要給大家介紹了關(guān)于Java怎么獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • VSCode+Gradle搭建Java開(kāi)發(fā)環(huán)境實(shí)現(xiàn)

    VSCode+Gradle搭建Java開(kāi)發(fā)環(huán)境實(shí)現(xiàn)

    這篇文章主要介紹了VSCode+Gradle搭建Java開(kāi)發(fā)環(huán)境實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot bean依賴(lài)屬性配置詳細(xì)介紹

    SpringBoot bean依賴(lài)屬性配置詳細(xì)介紹

    Spring容器是Spring的核心,一切SpringBean都存儲(chǔ)在Spring容器內(nèi)??梢哉f(shuō)bean是spring核心中的核心。Bean配置信息定義了Bean的實(shí)現(xiàn)及依賴(lài)關(guān)系,這篇文章主要介紹了SpringBoot bean依賴(lài)屬性配置
    2022-09-09
  • redis在java中的使用(實(shí)例講解)

    redis在java中的使用(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇redis 在java中的使用(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Java幾種常用的斷言風(fēng)格你怎么選

    Java幾種常用的斷言風(fēng)格你怎么選

    這篇文章主要介紹了Java幾種常用的斷言風(fēng)格你怎么選,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 使用自定義注解和@Aspect實(shí)現(xiàn)責(zé)任鏈模式的組件增強(qiáng)的詳細(xì)代碼

    使用自定義注解和@Aspect實(shí)現(xiàn)責(zé)任鏈模式的組件增強(qiáng)的詳細(xì)代碼

    責(zé)任鏈模式是一種行為設(shè)計(jì)模式,其作用是將請(qǐng)求的發(fā)送者和接收者解耦,從而可以靈活地組織和處理請(qǐng)求,本文講給大家介紹如何使用自定義注解和@Aspect實(shí)現(xiàn)責(zé)任鏈模式的組件增強(qiáng),文中有詳細(xì)的代碼示例供大家參考,感興趣的同學(xué)可以借鑒一下
    2023-05-05
  • java瀏覽器文件打包下載過(guò)程解析

    java瀏覽器文件打包下載過(guò)程解析

    這篇文章主要介紹了java瀏覽器文件打包下載過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • @DS注解的使用,動(dòng)態(tài)數(shù)據(jù)源,事務(wù)詳解

    @DS注解的使用,動(dòng)態(tài)數(shù)據(jù)源,事務(wù)詳解

    在項(xiàng)目中使用多數(shù)據(jù)源時(shí),可以借助苞米豆的dynamic-datasource-spring-boot-starter進(jìn)行配置,首先需引入相應(yīng)的jar包,并在application.yml中設(shè)置主從數(shù)據(jù)源,其中一般選擇master作為默認(rèn)數(shù)據(jù)源,在實(shí)現(xiàn)類(lèi)中通過(guò)@DS注解指定數(shù)據(jù)源
    2024-09-09
  • 在SpringBoot中使用UniHttp簡(jiǎn)化天地圖路徑規(guī)劃調(diào)用實(shí)踐記錄(場(chǎng)景分析)

    在SpringBoot中使用UniHttp簡(jiǎn)化天地圖路徑規(guī)劃調(diào)用實(shí)踐記錄(場(chǎng)景分析)

    本文介紹了如何在SpringBoot項(xiàng)目中使用UniHttp簡(jiǎn)化天地圖路徑規(guī)劃接口的調(diào)用,通過(guò)一個(gè)具體的例子展示了如何根據(jù)中文地址獲取經(jīng)緯度坐標(biāo),并使用UniHttp調(diào)用天地圖路徑規(guī)劃服務(wù),感興趣的朋友一起看看吧
    2025-02-02
  • spring boot simple類(lèi)型cache使用詳解

    spring boot simple類(lèi)型cache使用詳解

    這篇文章主要介紹了spring boot simple類(lèi)型cache使用,這里用的不是 redis 的緩存,simple 的緩存默認(rèn)用的是java的ConcurrentHashMap, 單純的simple緩存,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10

最新評(píng)論

友谊县| 通河县| 汉源县| 远安县| 简阳市| 蓬溪县| 蕲春县| 常德市| 莒南县| 汝阳县| 准格尔旗| 丰镇市| 马边| 鄄城县| 鄂托克前旗| 拉萨市| 郯城县| 兴安县| 化德县| 宜黄县| 康平县| 竹溪县| 屏山县| 江源县| 蕲春县| 榕江县| 深州市| 磴口县| 政和县| 平乐县| 平江县| 隆安县| 习水县| 吴忠市| 青神县| 元氏县| 朝阳区| 海宁市| 宝兴县| 洞口县| 定日县|