当前位置: 首页 > news >正文

Jdk7不同集合的扩容机制

Jdk7不同集合的扩容机制

集合类初始容量负载因子扩容公式扩容时机
ArrayList10新容量 = 旧容量 × 1.5元素数量超过容量时
HashMap160.75新容量 = 旧容量 × 2元素数量超过 容量 × 负载因子
HashSet160.75新容量 = 旧容量 × 2元素数量超过 容量 × 负载因子
Vector10新容量 = 旧容量 + 增量 或 × 2元素数量超过容量时
Hashtable110.75新容量 = 旧容量 × 2 + 1元素数量超过 容量 × 负载因子

通过了解不同集合类的扩容机制,可以更好地选择和使用合适的集合类,避免频繁扩容带来的性能开销。

ArrayList

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    // newCapacity = oldCapacity + oldCapacity / 2
    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:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

HashMap

头插法

void addEntry(int hash, K key, V value, int bucketIndex) {
    if ((size >= threshold) && (null != table[bucketIndex])) {
        // 旧容量 * 2
        resize(2 * table.length);
        hash = (null != key) ? hash(key) : 0;
        bucketIndex = indexFor(hash, table.length);
    }

    createEntry(hash, key, value, bucketIndex);
}

HashSet

通过HashMap实现的.

public HashSet() {
        map = new HashMap<>();
    }

Hashtable

protected void rehash() {
    HashtableEntry e, old;
    int i, index;
    int oldCapacity = table.length;
    HashtableEntry oldTable[] = table;
	// 新容量 = 旧容量 × 2 + 1
    int newCapacity = oldCapacity * 2 + 1;
    HashtableEntry newTable[] = new HashtableEntry[newCapacity];

    threshold = (int)(newCapacity * loadFactor);
    table = newTable;

    for (i = oldCapacity ; i-- > 0 ;) {
        for (old = oldTable[i] ; old != null ; ) {
            e = old;
            old = old.next;
            index = (e.hash & 0x7FFFFFFF) % newCapacity;
            e.next = newTable[index];
            newTable[index] = e;
        }
    }
}

Vector

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

相关文章:

  • 新手村:数据预处理-缺失值补充策略
  • 电商商品系统的演进分析
  • 第36周:文献阅读
  • 计算机四级 - 数据库原理 - 第4章 「关系数据库标准语言SQL」
  • deepseek GRPO算法保姆级讲解(数学原理+源码解析+案例实战)
  • FPGA学习(二)——实现LED流水灯
  • Python游戏开发自学指南:从入门到实践(第四天)
  • Python 基础知识整理笔记
  • Spring 事务失效的 8 种场景!
  • mac intel芯片下载安卓模拟器
  • 怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题
  • 设计模式(行为型)-备忘录模式
  • C++初阶——类和对象(三) 构造函数、析构函数
  • 开源新星DeepSearcher:用AI重新定义“搜索”的边界
  • 【004】deepseek本地化部署后,python的调用方式_#py
  • Leetcode2272:最大波动的子字符串
  • Java多线程入门
  • 基于牛优化( OX Optimizer,OX)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
  • aws(学习笔记第三十三课) 深入使用cdk 练习aws athena
  • A* floyd算法 bellman-ford
  • 在线设计装修软件/aso优化推广
  • 网站三级域名对网站有影响吗/怎么引流推广自己的产品
  • 服装厂做1688网站效果好不好/个人网站
  • 长春建站企业/百度一下 你就知道官方
  • phpcms v9 网站建设入门/网站外链分析工具
  • 龙华网站建设服务/新网店怎么免费推广