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

學習一下Java的ArrayList和contains函數(shù)和擴容機制

這篇具有很好參考價值的文章主要介紹了學習一下Java的ArrayList和contains函數(shù)和擴容機制。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

起因

在Leetcode上做題寫了兩種暴力解法,但是執(zhí)行效率上不太一樣。
學習一下Java的ArrayList和contains函數(shù)和擴容機制

時間上差很遠,內(nèi)存雖然差不多但是前者擊敗30%,后者擊敗94%。這兩種解法區(qū)別是用一條ArrayList還是兩條來存數(shù)據(jù),所以contains雖然執(zhí)行次數(shù)一樣但是檢測的長度上不一樣,而且ArrayList的擴容次數(shù)也不一樣,所以學習一下。

contains(Object o)

直接翻(JDK8)源碼:
學習一下Java的ArrayList和contains函數(shù)和擴容機制
nullobject區(qū)分開來還是因為equals有一方是null的話都會導致異常. 合并一起寫的話可以用Objects.equals(obj1, obj2)的寫法.
所以顯然暴力解法用到的contains原理就是樸實無華的一遍遍搜索所以時間特別長.

ArrayList擴容機制

省流: 直接看最下面的grow函數(shù).

如果是默認的ArrayList, 添加元素時會先計算數(shù)組長度, 如果元素個數(shù)+1大于當前數(shù)組長度+1大于elementData.length時進行擴容,擴容后的數(shù)組大小是: oldCapacity + (oldCapacity >> 1) ,位運算右移1位表示除以2, 所以可以理解成1.5倍擴容。

涉及到的源碼:

// 向指定索引位置插入元素
public void add(int index, E element) {
    // 檢查索引范圍
    rangeCheckForAdd(index);

    // 確保容量足夠
    ensureCapacityInternal(size + 1);  // 增加 modCount(用于支持并發(fā)修改的計數(shù)器)
    // 使用 System.arraycopy 將元素后移,為新元素騰出位置, 這是跟另一個add的區(qū)別?????
    System.arraycopy(elementData, index, elementData, index + 1, size - index);
    elementData[index] = element; // 在指定位置插入新元素
    size++; // 更新列表大小
}

// 在列表末尾添加元素
public boolean add(E e) {
    // 確保容量足夠
    ensureCapacityInternal(size + 1);  // 增加 modCount
    elementData[size++] = e; // 在列表末尾添加新元素
    return true;
}

// 內(nèi)部方法:確保容量足夠
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

// 內(nèi)部方法:計算容量
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        // 如果內(nèi)部數(shù)組為空,返回默認容量或所需容量中的較大者
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity; // 否則返回所需容量
}

// 內(nèi)部方法:確保容量足夠
private void ensureExplicitCapacity(int minCapacity) {
    modCount++; // 增加并發(fā)修改計數(shù)器

    // 檢查容量是否足夠,如果不夠則擴展
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

// 內(nèi)部方法:擴展容量
private void grow(int minCapacity) {
    // 溢出安全的代碼
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); // 新容量通常為舊容量的1.5倍
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity; // 如果新容量小于所需容量,使用所需容量
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity); // 處理可能的巨大容量情況
    // 使用 Arrays.copyOf 擴展數(shù)組容量
    elementData = Arrays.copyOf(elementData, newCapacity);
}


實際上Array.copyof底層調(diào)用的還是System.arraycopy.文章來源地址http://www.zghlxwxcb.cn/news/detail-711403.html

到了這里,關(guān)于學習一下Java的ArrayList和contains函數(shù)和擴容機制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 源碼分析——ArrayList源碼+擴容機制分析

    ArrayList 的底層是數(shù)組隊列,相當于動態(tài)數(shù)組。與 Java 中的數(shù)組相比,它的容量能動態(tài)增長。在添加大量元素前,應(yīng)用程序可以使用 ensureCapacity 操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數(shù)量。 ArrayList 繼承于 AbstractList ,實現(xiàn)了 List , RandomAccess , Cloneable , ja

    2024年02月14日
    瀏覽(19)
  • 【Java集合類面試二十六】、介紹一下ArrayList的數(shù)據(jù)結(jié)構(gòu)?

    【Java集合類面試二十六】、介紹一下ArrayList的數(shù)據(jù)結(jié)構(gòu)?

    文章底部有個人公眾號: 熱愛技術(shù)的小鄭 。主要分享開發(fā)知識、學習資料、畢業(yè)設(shè)計指導等。有興趣的可以關(guān)注一下。為何分享? 踩過的坑沒必要讓別人在再踩,自己復盤也能加深記憶。利己利人、所謂雙贏。 面試官:介紹一下ArrayList的數(shù)據(jù)結(jié)構(gòu)? 參考答案: ArrayList的底

    2024年02月08日
    瀏覽(17)
  • 深入源碼解析ArrayList:探秘Java動態(tài)數(shù)組的機制與性能

    深入源碼解析ArrayList:探秘Java動態(tài)數(shù)組的機制與性能

    1.1 介紹ArrayList的基本概念和作用 在Java中,ArrayList是一個實現(xiàn)了List接口的動態(tài)數(shù)組。它可以根據(jù)需要自動增加大小,因此可以存儲任意數(shù)量的元素。 基本概念: ArrayList是Java中常用的集合類之一,它可以存儲對象,并且可以根據(jù)索引訪問和操作這些對象。 ArrayList是基于數(shù)組

    2024年02月04日
    瀏覽(33)
  • ArrayList是如何動態(tài)擴容的

    ArrayList是Java中常用的動態(tài)數(shù)組實現(xiàn),在底層是使用數(shù)組來存儲元素。當需要擴展ArrayList的長度時,它會執(zhí)行以下步驟: 初始化數(shù)組:在創(chuàng)建ArrayList對象時,會初始化一個初始長度的數(shù)組來存儲元素。默認情況下,初始長度為10。 添加元素時的擴容:當往ArrayList中添加元素時

    2024年02月15日
    瀏覽(26)
  • java學習——ArrayList和泛型(學習記錄)

    java學習——ArrayList和泛型(學習記錄)

    學習資料來自菜鳥教程 ArrayList 類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。 ArrayList 繼承了 AbstractList ,并實現(xiàn)了 List 接口。 ArrayList 類位于 java.util 包中,使用前需要引入它,語法格式如下: E: 泛型數(shù)據(jù)類型,

    2024年02月06日
    瀏覽(21)
  • 關(guān)于函數(shù)宏offset_of 和 container_of的學習

    用途: 用于獲取獲取結(jié)構(gòu)體某一個成員在該結(jié)構(gòu)體中的位置 參數(shù)1: type ,表示結(jié)構(gòu)體的類型 參數(shù)2: member? 表示結(jié)構(gòu)體成員 分析: (unsigned int)?? (type*)0)-member? ?a.把值為0的指針強制轉(zhuǎn)換成該結(jié)構(gòu)體類型 b.通過該指針找到該成員 ? ??c.獲取該成員相對于0 的地址偏移 d.強轉(zhuǎn)

    2024年02月05日
    瀏覽(49)
  • 云盤滿了怎么辦?阿里云服務(wù)器云盤擴容操作了解一下

    云盤滿了怎么辦?阿里云服務(wù)器云盤擴容操作了解一下

    ???? 1.背景 ???? 2.確定擴容云盤類型與控制臺操作 ???? 3.ECS實例內(nèi)部擴容操作說明 ???????? 3.1 ECS實例內(nèi)部執(zhí)行擴容分區(qū) ???????? 3.2 ECS實例內(nèi)部執(zhí)行擴容文件系統(tǒng) ???? 軟件應(yīng)用的數(shù)據(jù)庫所在服務(wù)器磁盤使用率已經(jīng)達到97%,服務(wù)器操作實例如下: ???? 一旦使用

    2024年02月08日
    瀏覽(26)
  • ArrayList快速失敗機制

    ArrayList快速失敗機制

    ArrayList實現(xiàn)了一種稱為 快速失敗 (fail-fast)的機制,該機制在并發(fā)修改時會拋出 ConcurrentModificationException 異常。 這種機制的實現(xiàn)原理是:ArrayList在遍歷時會 記錄列表的修改總數(shù) (通過modCount字段),如果在遍歷過程中列表結(jié)構(gòu)發(fā)生變化,那么modCount的值會增大。 每次遍歷前,迭代器都會

    2024年02月04日
    瀏覽(18)
  • 【JAVA學習筆記】53 - 集合-List類及其子類Collection、ArrayList、LinkedList類

    【JAVA學習筆記】53 - 集合-List類及其子類Collection、ArrayList、LinkedList類

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/collection_ https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/list_ 目錄 項目代碼 集合 一、引入 數(shù)組 集合 二、集合的框架體系 單列集合? ? ? ? 雙列集合? ? ? ? Collection類 一、Collection類接

    2024年02月06日
    瀏覽(31)
  • vector擴容機制

    vector擴容機制

    在學習了vector的時候,總說linux下是以二倍擴容的,VS是以1.5倍擴容的。 但是想一想為什么擴容是這樣的呢,為什么不能是3倍或者其他倍數(shù)呢?? 所以帶著這些疑問,接著往下看。 首先,我們要知道vector的擴容機制:當向vector插入元素的時候,即當_finish == _end_of_storage,可能

    2024年01月15日
    瀏覽(63)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包