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

Java中的ArrayList和contains函數(shù)和擴容機制(源碼詳解)

 更新時間:2023年10月26日 09:21:43   作者:蕪光  
這篇文章主要介紹了Java中的ArrayList和contains函數(shù)和擴容機制,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

起因

在Leetcode上做題寫了兩種暴力解法,但是執(zhí)行效率上不太一樣。

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

contains(Object o)

直接翻(JDK8)源碼:

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.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.

到此這篇關于Java的ArrayList和contains函數(shù)和擴容機制的文章就介紹到這了,更多相關Java ArrayList和contains函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mybatis控制臺打印SQL執(zhí)行信息的方法詳解

    Mybatis控制臺打印SQL執(zhí)行信息的方法詳解

    SQL性能監(jiān)控是一個程序必要的功能,通常我們可以使用數(shù)據(jù)庫自帶的客戶端工具進行SQL性能分析,本章節(jié)只實現(xiàn)Mybatis執(zhí)行時對執(zhí)行SQL進行攔截,控制臺打印執(zhí)行SQL包括參數(shù)、執(zhí)行方法以及執(zhí)行時間,需要的朋友可以參考下
    2024-11-11
  • Mybatis原始執(zhí)行方式Executor代碼實例

    Mybatis原始執(zhí)行方式Executor代碼實例

    這篇文章主要介紹了Mybatis原始執(zhí)行方式Executor代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java使用Spire.Doc for Java輕松搞定Word文檔打印

    Java使用Spire.Doc for Java輕松搞定Word文檔打印

    在 Java 應用程序中實現(xiàn) Word 文檔的直接打印功能是許多企業(yè)級應用的需求,本文將詳細介紹如何使用 Spire.Doc for Java實現(xiàn)從加載 Word 文檔到指定打印機打印的完整解決方案,感興趣的小伙伴可以了解下
    2026-02-02
  • 最新評論

    忻城县| 罗城| 通化县| 双柏县| 新乡市| 尉犁县| 陇川县| 沙坪坝区| 安远县| 彩票| 屯昌县| 雷波县| 营口市| 田阳县| 教育| 斗六市| 社会| 泰顺县| 成武县| 田阳县| 普兰店市| 阿拉善右旗| 大荔县| 南开区| 陕西省| 江源县| 福贡县| 湖南省| 大冶市| 容城县| 安国市| 维西| 洛浦县| 景东| 柘荣县| 大洼县| 兰考县| 白朗县| 汉川市| 泾源县| 梁平县|