四、ArrayList底層源碼詳解-創(chuàng)新互聯(lián)

文章目錄
  • 特點
  • 底層源碼分析
    • 創(chuàng)建
      • 無參構造器
      • 有參構造器
      • 傳入集合的有參構造器
    • 擴容
    • 注意new ArrayList(0)

菜鳥教程ArrayList講解

成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站設計、成都網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元江津做網(wǎng)站,已為上家服務,為江津各地企業(yè)和個人服務,聯(lián)系電話:18980820575特點
  • 可以加入控制null(可加入多個)
  • 底層是數(shù)組實現(xiàn)的
  • ArrayList基本等同于Vector,除了ArrayList是線程不安全(執(zhí)行效率高)看源碼(沒有synchronized),在多線程情況下,不建議使用ArrayList
  • ArrayList中維護了一個0bject類型的數(shù)組elementData
  • 當創(chuàng)建ArrayList對象時,如果使用的是無參構造器,則初始elementData容量為0,第1次添加,則擴容elementData為10,如需要再次擴容,則擴容elementData為1.5倍。
  • 如果使用的是指定大小的構造器,則初始elementData容量為指定大小,如果需要擴容,則直接擴容elementData為1.5倍。
底層源碼分析 創(chuàng)建 無參構造器

ArrayList list = new ArrayList();底層的實現(xiàn)方式
在這里插入圖片描述

有參構造器

ArrayList list = new ArrayList(8);底層實現(xiàn)
在這里插入圖片描述

傳入集合的有參構造器

在這里插入圖片描述

  • elementData = c.toArray():將c對象轉換成數(shù)組賦值給elementData
  • 然后判斷內容是否為空,為空的話就直接賦值一個空數(shù)組
  • 不為空的話需要判斷elementData是不是一個Object[].class,(因為c.toArray()是轉換成數(shù)組賦值給elementData,而elementData里面添加的元素都是以Object[].class添加進去的),所以如果不是Object[].class類就轉換成Object[].class類。

也就說明,無參構造器,一開始得到的集合是空的

擴容

list.add(new Book(“紅樓夢”,30,“曹雪芹”));底層的實現(xiàn)

  1. 首先走到這里在這里插入圖片描述

    • E e:表示添加數(shù)據(jù)時傳進來的數(shù)據(jù)
    • ensureCapacityInternal(size + 1):判斷是否需要擴容(無參構造器一開始未初始化size,java中默認為0)
    • elementData[size++] = e:add是在最后添加數(shù)據(jù)
  2. 然后再進入ensureCapacityInternal(size + 1)判斷是否需要擴容在這里插入圖片描述

  3. 進入calculateCapacity(Object[] elementData, int minCapacity)確定擴容的容量在這里插入圖片描述

    • DEFAULTCAPACITY_EMPTY_ELEMENTDATA:空數(shù)組
    • DEFAULT_CAPACITY常量10
    • minCapacity:數(shù)組添加完這個數(shù)據(jù)時的容量
  4. 再進入這個方法,確定添加數(shù)據(jù)

    • modCount:記錄添加次數(shù)(防止多線程同時修改)
    • if (minCapacity - elementData.length >0):判斷當前內容和數(shù)組容量大小,如果數(shù)組容量夠就沒必要擴容
  5. 最后才進行擴容在這里插入圖片描述

注意new ArrayList(0)

若有參構造時,傳的數(shù)據(jù)是0,那么,擴容還是會按照0擴容,不會按照無參時考慮是否大于10,來擴容。即擴容后elementData數(shù)組容量依次為0、newCapacity=1、newCapacity=2、newCapacity=(2+2/2)=3、newCapacity=(3+3/2)=4,newCapacity=(4+4/2)=6,即第六次添加數(shù)據(jù)不擴容,第七次添加還用擴容…

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁題目:四、ArrayList底層源碼詳解-創(chuàng)新互聯(lián)
本文地址:http://bm7419.com/article10/cdeego.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計、微信公眾號、做網(wǎng)站、關鍵詞優(yōu)化、網(wǎng)頁設計公司建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計