栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java集合 ArrayList 扩容

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java集合 ArrayList 扩容

Java的集合框架 集合的分类

可以分为单列集合和双列集合

单列集合主要有Collection下面的List与Set,其中List最长被用到的是ArrayList与linkedList以及Vctor三种 Set最常用的是我们的HashSet以及TreeSet linkedHashSet可以使Set有序(插入与输出)

Collection都可以使用迭代器进行迭代

UML 类图如下

双列集合Map是基类

Map集合下常用的有HashMap与ConcurrentHashMap 、TreeMap、以及linkedHashMap(保证插入的顺序与输出的顺序一致)

类图如下

ArrayList的源码解析

1、无参构造方法第一次构建创建的数组使{} 没有值 长度是0

list第一次添加元素,不管什么时候添加元素都会查看是需要进行扩容

计算所需要的容量第一次默认是数组大小是10

grow()是进行扩容的方法除了第一次默认是10 以后每一次都是扩容1.5倍

如果使用有参构造方法的话每次以后每次扩容1.5倍 不演示调试截图了

代码整理

// 存储数据的集合
transient Object[] elementData; // non-private to simplify nested class access  
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// list集合的add方法
public boolean add(E e) {
        // size 默认是0 第一次添加传入的参数就是 0+1
        ensureCapacityInternal(size + 1);  // Increments modCount!!
    	// 确保内部容量没有问题以后 就进行复制操作
        elementData[size++] = e;
        return true;
}
// 确保内部的容量可用
private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 计算容量的方法
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        // 进入这里说明集合就是初始值 所以看需要的容量的最小值与 默认容量之间那个大 就返回默认容量
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    // 如果前面没有返回说明了 数组已经进行了初始化 就返回现在需要的容量大小
    return minCapacity;
}
//  确保容量
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    
    // overflow-conscious code  如果容量不够就进行扩容 最小的容量都比数组的长度大了 那肯定就是要进行扩容了
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
// 扩容方法
private void grow(int minCapacity) {
    // overflow-conscious code
    // 先取出原来的数组容量 第一次取就是0
    int oldCapacity = elementData.length;
    // 新的数组长度计算 就是 old + old / 2 原来的1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    // 如果new 计算出来的容量不如要求最小的容量 就把new 容量 重新复制成 min
    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);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755217.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号