Java集合框架——ArrayList

本文深入解析了ArrayList的特点、常用方法及源码细节,包括其数组底层实现、动态扩容机制、增删改查操作,以及与数组的异同点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

List接口下常用的实现类——ArrayList

1、特点

1)底层实现是数组

2)数据可重复

3)可以有多个null

4)存储的是单个值

5)保证插入的数据有序

6)查询、修改效率高;删除、增加效率低

2、常用实现方法

int size();//获取存储数据的个数

boolean isEmpty();//判断集合是否为空

boolean contains(Object o);//判断集合当中是否存在该元素

Iterator<E> iterator();//实例化迭代器对象(遍历)

Object[] toArray();//将集合转化为数组

boolean add(E e);//往集合中添加元素

boolean remove(Object o);//从集合中删除元素(删除指定的元素)

boolean containsAll(Collection<?> c)//判断集合中是否存在传入集合的所有元素

void clear();//对集合所有元素删除

3、ArrayList源码解读

1)继承关系

public class ArrayList<E> extends AbstractList<E>

          implements List<E>, RandomAccess, Cloneable, java.io.Serializable

继承AbstractList类,实现了List<E>接口,ArrayListList接口的一个实现类

 Cloneable 可以克隆、java.io.Serializable 可以进行序列化和反序列化操作

2)基本属性

a.数组的默认初始容量

private static final int DEFAULT_CAPACITY = 10;

因为ArrayList底层是由一个Object[]数组构成,而这个Object[]数组的默认长度是10,所以ArrayList长度默认容量是10。

b.数组的初始化使用

private static final Object[] EMPTY_ELEMENTDATA = {};

c.ArrayList的底层数据结构是数组

private transient Object[] elementData;

d.集合中存储元素的个数

private int size;

e.modCount表示的是版本控制,添加,删除,修改之类的操作都会++操作

protected transient int modCount = 0;

3)构造函数

    a.//有参构造,参数表示数组初始大小

    直接对elementData属性进行初始化

    public ArrayList(int initialCapacity) {

        super();

        if (initialCapacity < 0)

            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);

        this.elementData = new Object[initialCapacity];

    }

b.//无参构造,elementData数组为空

    public ArrayList() {

        super();

        this.elementData = EMPTY_ELEMENTDATA;

    }

c.//构造函数,参数是集合类型的一个对象

public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();//将集合转化为数组
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

4)增长方式

private void grow(int minCapacity) {
        // overflow-conscious code
        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);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

5)增删改查操作

a.增加元素

    public boolean add(E e) {//即相当于尾插
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

判断数组是否为空,若为空,数组大小设置为10

如果需要扩容,数组按照1.5倍大小进行扩容

将元素插入数组elementData,并且size+1

特点:存储重复数据,可以存储null

    public void add(int index, E element) {//按索引增加元素
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

b.删除元素

    public E remove(int index) {//按索引删除
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

  

public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }
要对值进行拆包操作(list.remove(Integer.valueOf(o));)才可以调用此remove方法
特点:
数组起始元素是0
找到第一个出现的元素直接删除并返回
时间复杂度o(n)

c.获取当前元素

public E get(int index) {//通过索引位置直接查询数组elementData的元素
        rangeCheck(index);
        return elementData(index);
    }

补充:两个集合的交集、并集、差集

并集:两集合所有元素的总和

交集:两个集合中共有元素,即你有我也有的

差集:集合a中除了和集合b共有元素之外的元素,ab的差集;即我有你没有的

比如:集合A:1 2 3   集合B:3 4 5

则A与B的并集是1 2 3 3 4 5,交集:3,A与B的差集:1 2 ,B与A的差集:4 5

ArrayList<Integer> a=new ArrayList<>();
        a.add(1);
        a.add(2);
        a.add(3);
        ArrayList<Integer> b=new ArrayList<>();
        b.add(3);
        b.add(4);
        b.add(5);
       //两个集合的并集
        a.addAll(b);
       //两个集合的交集
        a.retainAll(b);
       //a与b的差集
        b.retainAll(a);
        a.removeAll(b);

ArrayList与数组的异同点?

不同点:1)ArrayList只能存储引用数据类型;而数组既可以存储基本数据类型也可以存储引用数据类型;

               2)ArrayList的大小可以动态指定,它的大小可在初始化时指定也可以不指定,也就是说该对象的空间可以任意增加;                       而数组在初始化时必须指定大小;

               3)ArrayList不支持多维,而数组支持多维。

相同点:底层是数组,具有数组的特性,拥有索引,可以快速找到元素

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值