ArraList源码分析

ArraList源码分析

构造函数

ArrayList提供了多个重载构造函数,既可以指定初始容量也可以指定初始集合,或什么都不指定

无参构造函数

通过ArrayList()构造函数,可以构造一个空的ArrayList,使用DEFAULTCAPACITY_EMPTY_ELEMENTDATA空对象数组初始化属性elementData属性,此属性即用来存储我们add添加进来的元素

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

添加元素

ArrayList提供多个添加元素的Api,既可以单个添加到末尾,又可以指定位置添加元素,也可以批量添加元素

添加单个元素到末尾

add(E e)提供添加单个元素到集合末尾的功能,其实现比较简单,一共分为两步

  • 检查数组容量是否充足,否则进行扩容

  • 向数组添加新元素

public boolean add(E e) {
    // 判断容量及扩容
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    // 添加元素
    elementData[size++] = e;
    return true;
}
ensureCapacityInternal容量判断与扩容解析
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

ensureCapacityInternal方法参数minCapacity为需要的最小集合容量,在add方法调用时会将size + 1,其中size即为当前集合元素个数即数组elementData的实际存储元素个数。在ensureCapacityInternal方法中先调用calculateCapacity(Object[] elementData, int minCapacity)方法计算需要的最小集合容量

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

calculateCapacity计算逻辑为如果当前元素集合为空,则取minCapacity与DEFAULT_CAPACITY(10)的较大值;如果不为空则直接返回minCapacity。当计算完集合所需容量之后ensureCapacityInternal方法继续调用ensureExplicitCapacity方法

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

在ensureExplicitCapacity方法中,首先将属性modCount加一,此属性表示列表结构更改次数。如果参数minCapacity大于目前已有元素列表大小,则执行grow方法传入minCapacity参数值

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

在grow方法中,先判断minCapacity是否大于当前元素容量的1.5倍,如果大于,则按minCapacity进行扩容;如果小于,则按1.5倍容量扩容。但如果需要的容量大于MAX_ARRAY_SIZE(值为Integer.MAX_VALUE - 8),则会调用hugeCapacity方法重新计算容量

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    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);
}

在hugeCapacity方法中,如果传入的需要扩展容量为负数,则抛出OutOfMemoryError异常。如果需要扩展容量大于MAX_ARRAY_SIZE则返回Integer.MAX_VALUE,否则返回MAX_ARRAY_SIZE

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

至此添加单个元素的源码解析便结束

基于Spring Cloud和CAS的单点登录系统是一个采用微服务架构的高可用认证授权平台,主要用于解决企业级应用中的统一身份认证和单点登录需求。该系统基于Java语言开发,采用Spring Boot和Spring Cloud作为核心框架,集成了CAS 5.1.x作为认证服务,实现了配置中心、监控平台和服务管理等功能模块,支持Docker容器化部署,确保系统的高可用性和可扩展性。 系统的主要功能包括:CAS认证服务,提供统一的用户登录、认证和授权机制;配置中心,实现配置信息的集中管理和动态更新;监控平台,实时监控系统运行状态和性能指标;服务管理,支持服务的注册、发现和负载均衡。系统采用模块化设计,遵循客户端-服务器模式,应用了单例模式、工厂模式和观察者模式等设计模式,提升了代码的可维护性和复用性。 该单点登录系统适用于企业、教育机构或大型网站等需要多应用统一登录的场景,能够有效减少用户重复登录的麻烦,提高安全性和管理效率。系统源码完整,包含详细的文档和部署指南,适合作为计算机科学或软件工程专业的毕业设计项目,帮助学生深入理解微服务架构、单点登录技术和云原生应用开发。资源包括系统源码和配套论文,论文内容涵盖系统需求分析、设计、实现和测试等全过程,为学习者提供全面的参考和实践指导。 通过本资源,用户可以快速搭建一个高可用的单点登录系统,学习到Spring Cloud、CAS、Docker等前沿技术的实际应用,提升项目开发能力和系统设计思维。无论是用于毕业设计、课程项目还是实际部署,本系统都具有较高的实用价值和教学意义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值