国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析

這篇具有很好參考價(jià)值的文章主要介紹了Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

前言

List、Set、HashMap作為Java中常用的集合,需要深入認(rèn)識(shí)其原理和特性。

本篇博客介紹常見的關(guān)于Java中List集合的面試問題,結(jié)合源碼分析題目背后的知識(shí)點(diǎn)。

關(guān)于的Set的博客文章如下:

  • Java進(jìn)階(Set)——面試時(shí)Set常見問題解讀 & 結(jié)合源碼分析

關(guān)于HaseMap的博客文章如下:

  • Java進(jìn)階(HashMap)——面試時(shí)HashMap常見問題解讀 & 結(jié)合源碼分析
  • Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識(shí)

其他相關(guān)的List的文章合集如下:

  • 手動(dòng)實(shí)現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題

  • Java學(xué)數(shù)據(jù)結(jié)構(gòu)(1)——抽象數(shù)據(jù)類型ADT & 表List、棧Stack和隊(duì)列Qeue

引出


1.ArrayList如何擴(kuò)容,1.5倍;
2.ArrayList如何拷貝,深拷貝,淺拷貝;
3.ArrayList的增加或者刪除效率低,arraycopy方法;
4.指定長(zhǎng)度創(chuàng)建ArrayList對(duì)象,避免頻繁擴(kuò)容;
5.線程安全的ArrayList集合:Collections.synchronizedList;
6.LinkedList 和 ArrayList 該如何選擇:ArrayList增刪效率低,查詢效率高;LinkedList 查詢效率低,增刪效率高
7.Vector 集合和 ArrayList 區(qū)別:Vector擴(kuò)容機(jī)制為原始的2倍,線程安全;文章來源地址http://www.zghlxwxcb.cn/news/detail-740670.html

ArrayList 如何擴(kuò)容的?/ArrayList的大小是如何自動(dòng)增加的?

ArrayList初始化的時(shí)候,若沒有給定長(zhǎng)度,則默認(rèn)調(diào)用無參構(gòu)造

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

此處elelmentData為ArrayList底層數(shù)組,后面DEFAULTCAPACITY_EMPTY_ELEMENTDATA 為常量數(shù)組初值為空,即長(zhǎng)度為0

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

1.add添加第一個(gè)元素

當(dāng)執(zhí)行add方法添加第一個(gè)元素時(shí),執(zhí)行下面的代碼

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

此處涉及到兩條代碼:

  • ensureCapacityInternal方法內(nèi)會(huì)調(diào)用calculateCapacity方法,此處才是賦予數(shù)組長(zhǎng)度為10

ensureCapacityInternal 方法

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

calculateCapacity方法

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    //如果數(shù)組是空的
       if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
           //返回?cái)?shù)組的容量,DEFAULT_CAPACITY=10
           return Math.max(DEFAULT_CAPACITY, minCapacity);
       }
       return minCapacity;
   }

此時(shí)集合可以添加默認(rèn)的10個(gè)元素

2.添加第11個(gè)元素時(shí)

當(dāng)添加第11個(gè)元素時(shí),ensureExplicitCapacity方法中,minCapacity為11,而原數(shù)組長(zhǎng)度為10,所以if結(jié)構(gòu)進(jìn)入grow方法-擴(kuò)容核心方法

ensureExplicitCapacity方法

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

grow方法-擴(kuò)容核心方法

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

private void grow(int minCapacity) {
       // overflow-conscious code
        //把舊的長(zhǎng)度賦值給oldCapacity
       int oldCapacity = elementData.length;
        //新的長(zhǎng)度就=舊的長(zhǎng)度*1.5
       int newCapacity = oldCapacity + (oldCapacity >> 1);
       if (newCapacity - minCapacity < 0)
           newCapacity = minCapacity;
       if (newCapacity - MAX_ARRAY_SIZE > 0)
           newCapacity = hugeCapacity(minCapacity);
       // minCapacity is usually close to size, so this is a win:
        //按照新的長(zhǎng)度復(fù)制出一個(gè)新的數(shù)組
       elementData = Arrays.copyOf(elementData, newCapacity);
   }
  • oldCapacity賦值為原數(shù)組長(zhǎng)度,為10 ,newCapacity賦值為原長(zhǎng)度1.5倍,即15

  • 調(diào)用復(fù)制數(shù)組方法,將之前的數(shù)組復(fù)制到新的數(shù)組中,并將需要添加的元素加到數(shù)組最后一位,完成擴(kuò)容!

如何復(fù)制某個(gè)ArrayList到另一個(gè)Arraylist中去?

重寫clone方法,ArrayList克隆

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

厘清概念:深淺拷貝

Java進(jìn)階(4)——結(jié)合類加載JVM的過程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

淺拷貝:雖然返回一個(gè)元素一樣的ArrayList,復(fù)制的是元素的引用,即其中一個(gè)改變了元素,另一個(gè)也會(huì)跟著改變

兩個(gè)集合中間存儲(chǔ)了同一份元素的引用

例如:

深拷貝:重寫clone方法,利用迭代器iterator或遍歷集合,重新創(chuàng)建引用對(duì)象,逐個(gè)添加

例如:

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

復(fù)制的方法

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

list.clone()

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

clone.addALl(list);

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

Collections.copy(clone,list);

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

在索引中ArrayList的增加或者刪除某個(gè)對(duì)象的運(yùn)行過程?效率很低嗎?解釋一下為什么?

效率確實(shí)低

效率是很低的,因?yàn)锳rrayList無論是增加或者刪除某個(gè)對(duì)象,我們都要通過對(duì)數(shù)組中的元素進(jìn)行移位來實(shí)現(xiàn)。

  • 增加元素時(shí),我們要把要增加位置及以后的所有元素都往后移一位,先騰出一個(gè)空間,然后再進(jìn)行添加。
  • 刪除某個(gè)元素時(shí),我們也要把刪除位置以后的元素全部元素往前挪一位,通過覆蓋的方式來刪除。

而這種移位就需要不斷的arraycopy,是很耗時(shí)間的,所以效率自然也很低。

源碼arraycopy方法

增加元素時(shí)

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

刪除元素時(shí)

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

現(xiàn)在我有一個(gè)很大的數(shù)組需要拷貝,原數(shù)組大小是 5k,請(qǐng)問如何快速拷貝?

指定長(zhǎng)度創(chuàng)建ArrayList對(duì)象,避免頻繁擴(kuò)容

如何獲得一個(gè)線程安全的ArrayList集合?

Collections.synchronizedList

List<Object> datas = Collections.synchronizedList(new ArrayList<>());

源碼分析

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

從源碼可以看到集合操作都加了synchronized 關(guān)鍵字,保證了在同一時(shí)刻,數(shù)組和鏈表只會(huì)被一個(gè)線程所修改。

LinkedList 和 ArrayList 該如何選擇?

選擇原則

  • ArrayList 底層為數(shù)組,在增加和刪除元素時(shí)會(huì)頻繁的調(diào)用arraycopy,所以查詢效率高,增刪效率低
  • LinkedList 底層為鏈表,故查詢效率低,但增刪效率高。

LinkedList源碼node節(jié)點(diǎn)

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

  • item 為當(dāng)前元素
  • next指向下一個(gè)元素,若為最后一個(gè)則為null
  • prev指向上一個(gè)元素,若為第一個(gè)則為null

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試

Vector 集合

  1. vector 和 ArrayList 基本一樣
  2. 區(qū)別在于 vector擴(kuò)容機(jī)制為原始的2倍,ArrayList為之前的1.5倍
  3. vector 是線程安全的,ArrayList是非線程安全的

Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析,Java,java,list,面試


總結(jié)

1.ArrayList如何擴(kuò)容,1.5倍;
2.ArrayList如何拷貝,深拷貝,淺拷貝;
3.ArrayList的增加或者刪除效率低,arraycopy方法;
4.指定長(zhǎng)度創(chuàng)建ArrayList對(duì)象,避免頻繁擴(kuò)容;
5.線程安全的ArrayList集合:Collections.synchronizedList;
6.LinkedList 和 ArrayList 該如何選擇:ArrayList增刪效率低,查詢效率高;LinkedList 查詢效率低,增刪效率高
7.Vector 集合和 ArrayList 區(qū)別:Vector擴(kuò)容機(jī)制為原始的2倍,線程安全;

到了這里,關(guān)于Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 強(qiáng)化學(xué)習(xí)從基礎(chǔ)到進(jìn)階-常見問題和面試必知必答[2]:馬爾科夫決策、貝爾曼方程、動(dòng)態(tài)規(guī)劃、策略價(jià)值迭代

    馬爾可夫性質(zhì)(Markov property,MP) :如果某一個(gè)過程未來的狀態(tài)與過去的狀態(tài)無關(guān),只由現(xiàn)在的狀態(tài)決定,那么其具有馬爾可夫性質(zhì)。換句話說,一個(gè)狀態(tài)的下一個(gè)狀態(tài)只取決于它的當(dāng)前狀態(tài),而與它當(dāng)前狀態(tài)之前的狀態(tài)都沒有關(guān)系。 馬爾可夫鏈(Markov chain) : 概率論和數(shù)

    2024年03月26日
    瀏覽(15)
  • JavaEE 面試常見問題

    JavaEE 面試常見問題

    Mybatis 是一種典型的半自動(dòng)的 ORM 框架,所謂的半自動(dòng),是因?yàn)檫€需要手動(dòng)的寫 SQL 語(yǔ)句,再由框架根據(jù) SQL 及 傳入數(shù)據(jù)來組裝為要執(zhí)行的 SQL 。其優(yōu)點(diǎn)為: 1. 因?yàn)橛沙绦騿T自己寫 SQL ,相對(duì)來說學(xué)習(xí)門檻更低,更容易入門。 2. 更方便做 SQL 的性能優(yōu)化及維護(hù)。 3. 對(duì)關(guān)系型數(shù)據(jù)

    2024年02月14日
    瀏覽(36)
  • 面試-Dubbo常見問題

    Dubbo 是一個(gè)RPC框架,包含注冊(cè)中心,服務(wù)提供方,服務(wù)消費(fèi)方,控制臺(tái),監(jiān)控中心。 Dubbo 啟動(dòng)時(shí)會(huì)從注冊(cè)中心拉取消費(fèi)者需要的提供方信息,如果依賴的服務(wù)提供方不可用,Dubbo消費(fèi)方會(huì)啟動(dòng)失敗,并且不停的向注冊(cè)中心請(qǐng)求提供方信息,拋出異常找不到對(duì)應(yīng)的提供方。可以

    2024年02月08日
    瀏覽(24)
  • 項(xiàng)目經(jīng)理崗面試常見問題

    一、注意事項(xiàng) ? ·電面邀約確認(rèn)(避免hr刷KPI): 請(qǐng)問貴司招聘的是什么崗位,是新建團(tuán)隊(duì)還是原有團(tuán)隊(duì)? 這邊面試流程是怎樣的,是 leader 直接面,還是? ? ·面試前鋪墊: 如果您對(duì)某部分感興趣,請(qǐng)隨時(shí)打斷我。 ? ·面試中發(fā)揮: 盡量采用 STAR 原則回答,即 情境( Si

    2024年02月05日
    瀏覽(30)
  • JVM基礎(chǔ),面試常見問題

    JVM基礎(chǔ),面試常見問題

    目錄 一.運(yùn)行時(shí)數(shù)據(jù)區(qū)域 1.線程獨(dú)享 (1)棧 (2)程序計(jì)數(shù)器 2.線程共享 (1)方法區(qū) (2)堆 二.內(nèi)存如何分配 1.指針碰撞法 2.空閑列表法 3.TLAB 三.對(duì)象在內(nèi)存中的組成 1.對(duì)象頭 (1)markword (2)指向類型的指針 (3)如果是數(shù)組-》數(shù)組長(zhǎng)度 2.實(shí)例數(shù)據(jù) 3.對(duì)齊填充 四.如何訪

    2024年01月23日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)面試常見問題】

    【數(shù)據(jù)結(jié)構(gòu)面試常見問題】

    數(shù)據(jù)結(jié)構(gòu)作為計(jì)算機(jī)的一門基礎(chǔ)學(xué)科,它在面試中占有很大的比重,本科階段,我們也學(xué)過數(shù)據(jù)結(jié)構(gòu)與算法,內(nèi)容比較多,也比較難,尤其是圖的應(yīng)用以及各類查找和排序算法,這些也都是核心內(nèi)容。數(shù)據(jù)結(jié)構(gòu)在實(shí)際的應(yīng)用中也比較多,因此,整理一些常見的筆試、面試的數(shù)

    2024年03月22日
    瀏覽(15)
  • 單片機(jī)面試常見問題

    1、中斷的概念?簡(jiǎn)述中斷的過程 (1)中斷:指CPU在正常執(zhí)行程序的過程中,由于內(nèi)部/外部事件的觸發(fā)或由程序的預(yù)先安排,引起CPU暫時(shí)中斷當(dāng)前正在運(yùn)行的程序,轉(zhuǎn)而執(zhí)行為內(nèi)部/外部事件或程序預(yù)先安排的事件的服務(wù)子程序,待中斷服務(wù)子程序執(zhí)行完畢后,CPU再返回到被

    2024年04月10日
    瀏覽(23)
  • docker常見面試問題詳解

    docker常見面試問題詳解

    在面試的時(shí)候,面試官常常會(huì)問一些問題: docker是什么,能做什么? docker和虛擬機(jī)的區(qū)別是什么呢? docker是用什么做隔離的? docke的網(wǎng)絡(luò)類型?docker數(shù)據(jù)之間是如何通信的? docker的數(shù)據(jù)保存問題? 常用的docker命令? docker制作鏡像相關(guān)? 下面,就讓我來詳細(xì)說明一些這些問

    2024年02月10日
    瀏覽(31)
  • kubernetes常見面試問題詳解

    kubernetes常見面試問題詳解

    在面試的時(shí)候,面試官常常會(huì)問一些問題: k8s是什么?有什么用? k8s由哪些組件組成? pod的啟動(dòng)流程? k8s里有哪些控制器? k8s的調(diào)度器里有哪些調(diào)度算法? pod和pod之間的通信過程? 外面用戶訪問pod數(shù)據(jù)流程? 你常用哪些命令? 容器的類型? 3種探針? pod的升級(jí)? HPA、V

    2024年02月10日
    瀏覽(21)
  • 大數(shù)據(jù)常見面試問題匯總

    目錄 第1章 核心技術(shù) 1.1 LinuxShell 1.1.1 Linux常用高級(jí)命令 1.1.2 Shell常用工具及寫過的腳本 1.1.3 Shell中單引號(hào)和雙引號(hào)區(qū)別 1.2 Hadoop 1.2.1 Hadoop常用端口號(hào) 1.2.2 HDFS讀流程和寫流程 1.2.3 HDFS小文件處理 1.2.4 HDFS的NameNode內(nèi)存 1.2.5 Shuffle及優(yōu)化 1.2.6 Yarn工作機(jī)制 1.2.7 Yarn調(diào)度器 1.2.8 HDFS塊大

    2024年02月14日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包