007Java集合002详解ArrayList

本文深入探讨了Java中ArrayList的详细信息,包括其作为最常见的集合的特性,如允许插入null和重复元素,基于数组的结构,线程不安全等。重点讨论了ArrayList的扩容机制,初始容量和扩容增量,并建议指定初始容量以优化性能。此外,文章还概述了ArrayList的方法,特别是迭代器的实现,并分析了源码,特别是数组的包访问权限和transient关键字在序列化中的作用。
摘要由CSDN通过智能技术生成

注意:本文基于JDK1.8进行记录。

1 简介

最常用的集合,允许任何符合规则的元素插入,包括null和重复元素。

底层是数组结构,提供了索引机制,查找效率高,增删效率低。

线程不安全。

2 扩容机制

数组结构会有容量的概念,ArrayList的初始容量默认为10,负载因子是1,表示当插入元素后个数超出原有长度时会进行扩增,扩容增量是0.5,所以扩增后容量为1.5倍,可使用方法手动扩容和缩减。

最好指定初始容量值,避免过多的进行扩容操作而浪费时间和效率。

3 方法说明

3.1 构造方法

// 空参构造器,返回默认容量为10的集合。
public ArrayList();
// 指定长度的构造器,如果长度为0,则返回容量为0的集合。
public ArrayList(int initialCapacity);
// 传入了一个集合的构造器,如果集合长度为0,返回容量为0的集合。
public ArrayList(Collection<? extends E> c);

3.2 常用方法

// 获取个数。
public int size();
// 判断是否为空。
public boolean isEmpty();
// 判断是否包含指定数据。
public boolean contains(Object o);
// 计算指定数据首次出现的下标。
public int indexOf(Object o);
// 计算指定数据最后出现的下标。
public int lastIndexOf(Object o);
// 获取指定下标的元素。
public E get(int index);
// 设置指定下标的指定元素,并返回旧元素。
public E set(int index, E element);
// 添加指定元素,并返回是否成功。
public boolean add(E e);
// 在指定位置添加指定元素。
public void add(int index, E element);
// 删除指定位置的元素,并返回删除的元素。
public E remove(int index);
// 删除指定元素,并返回是否成功。
public boolean remove(Object o);

4 源码分析

4.1 属性

// 默认的初始容量为10。
private static final int DEFAULT_CAPACITY = 10;
// 空数组。
private static final Object[] EMPTY_ELEMENTDATA = {};
// 默认容量的空数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 数组。
transient Object[] elementData;
// 元素个数。
private int size;

4.2 构造方法

// 空参构造器,返回默认容量为10的集合。
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// 指定长度的构造器,如果长度为0,则返回容量为0的集合。
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
    }
}
// 传入了一个集合的构造器,如果集合长度为0,返回容量为0的集合。
public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        // Object[]数组里的类型不一定都是Object类型的,有可能是Object的子类,所以要判断一下。
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

4.3 常用方法

// 获取个数。
public int size() {
    return size;
}
// 判断是否为空。
public boolean isEmpty() {
    return size == 0;
}
// 判断是否包含指定数据。
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
// 计算指定数据首次出现的下标。
public int indexOf(Object o) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值