一、概述
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
二、ArrayList 集合的特点
1. 长度可变,自动扩容。
-
添加数据的时候不需要考虑索引,默认将数据添加到末尾。
-
只能存储引用数据类型。在存储基本数据类型时,需要变成其对应的包装类。
三、扩容机制
当元素数量超过当前容量时,ArrayList 会自动创建更大的新数组,将旧元素复制过去。
简单说:ArrayList = 数组 + 自动扩容机制。
ArrayList 自动扩容的步骤如下:
-
计算新容量:默认扩容为原容量的 1.5 倍(公式:newCapacity = oldCapacity + (oldCapacity >> 1),右移 1 位等价于除以 2)。
-
创建新数组(长度为新容量)。
-
将旧数组的元素复制到新数组(System.arraycopy() 方法)。
-
用新数组替换旧数组(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;
}
}