Java 学习38:ArrayList 类

一、概述

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

ArrayList 继承了 AbstractList ,并实现了 List 接口。

二、ArrayList 集合的特点

​1. 长度可变,自动扩容。

  1. 添加数据的时候不需要考虑索引,默认将数据添加到末尾。

  2. 只能存储引用数据类型。在存储基本数据类型时,需要变成其对应的包装类。

三、扩容机制

当元素数量超过当前容量时,ArrayList 会自动创建更大的新数组,将旧元素复制过去。

简单说:ArrayList = 数组 + 自动扩容机制。

ArrayList 自动扩容的步骤如下:

  1. 计算新容量:默认扩容为原容量的 1.5 倍(公式:newCapacity = oldCapacity + (oldCapacity >> 1),右移 1 位等价于除以 2)。

  2. 创建新数组(长度为新容量)。

  3. 将旧数组的元素复制到新数组(System.arraycopy() 方法)。

  4. 用新数组替换旧数组(elementData = newElementData)。

扩容过程:

初始容量为 10,添加第 11 个元素时,扩容为 10 + 10/2 = 15。

当前容量为 15,添加第 16 个元素时,扩容为 15 + 15/2 = 22。

四、创建 ArrayList 对象

要使用 ArrayList,首先需要导入 java.util.ArrayList 包。创建 ArrayList 对象的语法如下

import java.util.ArrayList; // 导入 ArrayList 类

// 方法1:无参构造方法

ArrayList<E> objectName =new ArrayList<>(); // 默认初始容量为 10

// 方法2:指定初始容量的构造方法(推荐!避免频繁扩容)

ArrayList<E> objectName = new ArrayList<>( int initialCapacity ); // 指定初始容量,比如 50

这里的 E 是泛型,表示 ArrayList 将持有的对象类型,必须是引用类型。

五、ArrayList 类常用方法

方法名 说明
public boolean add( E element ) 将指定的元素追加到此集合的末尾
public boolean remove( E element ) 删除指定元素,返回值表示是否删除成功
public E remove ( int index ) 删除指定索引处的元素,返回被删除的元素
public E set( int index, E element ) 修改指定索引处的元素,返回被修改的元素
public E get( int index ) 返回指定索引处的元素
public int size() 返回集合中的元素的个数

例1:添加、访问、修改和删除元素。

java 复制代码
import java.util.ArrayList;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("baidu");
        sites.add("Taobao");
        sites.add("Weibo");

        // 输出
        System.out.println(sites);

        // 访问元素
        System.out.println(sites.get(1)); // 输出 baidu

        // 修改元素
        sites.set(2, "Wiki");

        // 删除元素
        sites.remove(3);

        // for循环遍历ArrayList
        for (int i = 0; i < sites.size(); i++) {
            System.out.println(sites.get(i));
        }

        // for-each循环遍历ArrayList
        for (String i : sites) {
            System.out.println(i);
        }
    }
}

例2:在集合存入三个用户对象。用户属性包括 id,username,password。定义一个方法,根据 id 查找对应的用户信息。

java 复制代码
import java.util.ArrayList;

class User {
    private String id;
    private String name;
    private String password;

    public User(String id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getPassword() {
        return password;
    }
}

public class ArrayListTest {
    public static void main(String[] args) {
        //1.创建集合对象
        ArrayList<User> list = new ArrayList<>();

        //2.创建用户对象
        User u1 = new User("001", "zhangsan", "123456");
        User u2 = new User("002", "lisi", "1234");
        User u3 = new User("003", "wangwu", "1234qwer");

        //3.把用户对象添加到集合当中
        list.add(u1);
        list.add(u2);
        list.add(u3);

        //4.调用方法,通过id获取对应的索引
        int index = getIndex(list, "001");
        User u = list.get(index);
        System.out.println(u.getId() + "," + u.getName() + ","+ u.getPassword());

    }


    //根据id查找对应的学生信息
    public static int getIndex(ArrayList<User> list, String id) {
        //遍历集合得到每一个元素
        for (int i = 0; i < list.size(); i++) {
            User u = list.get(i);
            String uid = u.getId();
            if(uid.equals(id)){
                return i;
            }
        }
        //集合里面所有的元素都比较完了,断定id是不存在的
        return -1;
    }
}
相关推荐
论迹复利12 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin12 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
宸津-代码粉碎机13 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_9637491014 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh14 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
源码宝14 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java14 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
lhldsg16 小时前
智慧场馆解决方案小程序开发实战:从架构设计到部署指南
java·小程序·uni-app
Freak嵌入式16 小时前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
devilnumber17 小时前
Oracle 与 MySQL substr 函数差异总结
java·数据库·mysql·oracle