ArrayList 概述
集合与数组对比
| 特性 | 数组 | ArrayList |
|---|---|---|
| 长度 | 固定 | 可变(自动扩容) |
| 存储类型 | 基本类型和引用类型 | 只能存储引用类型 |
| 性能 | 随机访问快 | 随机访问快,但增删慢 |
| 内存 | 连续内存 | 动态数组 |
| 安全性 | 编译时类型检查 | 泛型类型检查 |
基本数据类型包装类
| 基本类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
ArrayList 成员方法详解
1. 创建 ArrayList 对象
java
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// 方式1:完整写法
ArrayList<String> list1 = new ArrayList<String>();
// 方式2:JDK7+ 推荐写法(类型推断)
ArrayList<String> list2 = new ArrayList<>();
// 方式3:指定初始容量
ArrayList<String> list3 = new ArrayList<>(100);
// 方式4:存储基本类型(使用包装类)
ArrayList<Integer> intList = new ArrayList<>();
ArrayList<Double> doubleList = new ArrayList<>();
ArrayList<Character> charList = new ArrayList<>();
ArrayList<Boolean> boolList = new ArrayList<>();
}
}
2. 添加元素 - add()
java
public class AddMethodDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
// 1. 添加单个元素
boolean result1 = list.add("Java");
System.out.println("添加结果: " + result1); // true
System.out.println("集合内容: " + list); // [Java]
// 2. 连续添加多个元素
list.add("Python");
list.add("C++");
list.add("JavaScript");
System.out.println("添加多个后: " + list); // [Java, Python, C++, JavaScript]
// 3. 在指定位置插入元素
list.add(1, "Go"); // 在索引1处插入
System.out.println("插入后: " + list); // [Java, Go, Python, C++, JavaScript]
// 4. 添加基本类型(自动装箱)
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10); // 自动装箱:int -> Integer
numbers.add(20);
numbers.add(30);
System.out.println("数字集合: " + numbers); // [10, 20, 30]
}
}
3. 删除元素 - remove()
java
public class RemoveMethodDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
list.add("JavaScript");
list.add("Java"); // 重复元素
System.out.println("原始集合: " + list); // [Java, Python, C++, JavaScript, Java]
// 1. 删除指定元素(删除第一个匹配项)
boolean result1 = list.remove("Java");
System.out.println("删除结果: " + result1); // true
System.out.println("删除后: " + list); // [Python, C++, JavaScript, Java]
// 2. 按索引删除
String removedElement = list.remove(1); // 删除索引1的元素
System.out.println("删除的元素: " + removedElement); // C++
System.out.println("删除后: " + list); // [Python, JavaScript, Java]
// 3. 删除不存在的元素
boolean result2 = list.remove("Ruby");
System.out.println("删除Ruby结果: " + result2); // false
// 4. 删除所有指定元素
while (list.contains("Java")) {
list.remove("Java");
}
System.out.println("删除所有Java后: " + list); // [Python, JavaScript]
}
}
4. 修改元素 - set()
java
public class SetMethodDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
System.out.println("修改前: " + list); // [Java, Python, C++]
// 修改指定索引的元素
String oldValue = list.set(1, "JavaScript");
System.out.println("被替换的元素: " + oldValue); // Python
System.out.println("修改后: " + list); // [Java, JavaScript, C++]
// 修改不存在的索引会抛出异常
try {
list.set(5, "Ruby"); // 索引越界
} catch (IndexOutOfBoundsException e) {
System.out.println("错误: " + e.getMessage());
}
}
}
5. 查询元素 - get() 和 size()
java
public class GetMethodDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
list.add("JavaScript");
list.add("Go");
// 1. 获取集合大小
int size = list.size();
System.out.println("集合大小: " + size); // 5
// 2. 获取指定索引的元素
String element = list.get(2);
System.out.println("索引2的元素: " + element); // C++
// 3. 遍历集合(三种方式)
System.out.println("\n方式1:普通for循环");
for (int i = 0; i < list.size(); i++) {
System.out.println("索引 " + i + ": " + list.get(i));
}
System.out.println("\n方式2:增强for循环");
for (String str : list) {
System.out.println(str);
}
System.out.println("\n方式3:forEach + Lambda(Java 8+)");
list.forEach(str -> System.out.println(str));
// 4. 获取不存在的索引会抛出异常
try {
String value = list.get(10);
} catch (IndexOutOfBoundsException e) {
System.out.println("\n错误:索引越界");
}
}
}
ArrayList 其他常用方法
1. 清空集合
java
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.clear(); // 清空所有元素
System.out.println(list.size()); // 0
System.out.println(list.isEmpty()); // true
2. 判断是否包含
java
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println(list.contains("Java")); // true
System.out.println(list.contains("Ruby")); // false
3. 获取元素索引
java
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Java");
System.out.println(list.indexOf("Java")); // 0(第一个)
System.out.println(list.lastIndexOf("Java")); // 2(最后一个)
System.out.println(list.indexOf("Ruby")); // -1(不存在)
4. 转换为数组
java
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
// 转换为数组
String[] array = list.toArray(new String[0]);
for (String str : array) {
System.out.println(str);
}
注意事项
1. 泛型的重要性
java
// 正确:使用泛型
ArrayList<String> list1 = new ArrayList<>();
list1.add("Hello");
// 错误:不使用泛型(不推荐)
ArrayList list2 = new ArrayList();
list2.add("Hello");
list2.add(123); // 可以添加不同类型,但容易出错
String str = (String) list2.get(1); // 运行时异常:ClassCastException
2. 性能考虑
-
ArrayList 适合随机访问,不适合频繁的插入和删除
-
如果知道大致容量,可以在创建时指定初始容量
-
频繁增删时考虑使用 LinkedList
3. 并发安全
-
ArrayList 不是线程安全的
-
多线程环境下应该使用 Collections.synchronizedList() 或 CopyOnWriteArrayList
java
import java.util.ArrayList;
public class ArrayListDemo1 {
public static void main(String[] args) {
//1.创建集合对象
//泛型:限定集合存储的数据类型
//此时我们创建的是ArrayList的对象,而ArrayList是Java已经写好的一个类
//这个类在底层做了一些处理
//打印对象不是地址值,而是集合中存储的数据内容
//在展示时我们会拿[]把所有数据进行包裹
ArrayList<String> list = new ArrayList<String>();
//JDK7以后
//ArrayList<String> list = new ArrayList<>();
System.out.println(list);
}
}
java
import java.util.ArrayList;
public class ArrayListDemo2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
System.out.println("空字符串:"+list);
//增
System.out.println("添加hello,world,111,222");
boolean result = list.add("hello");
list.add("world");
list.add("111");
list.add("222");
System.out.println("是否添加成功:"+result);
System.out.println("添加后的结果:"+list);
System.out.println("------------------");
//删
System.out.println("删除world");
boolean result1 = list.remove("world");
System.out.println("是否删除成功:"+result1);
System.out.println("删除后的结果:"+list);
System.out.println("--------------------");
System.out.println("删除0索引的数据");
String result3 = list.remove(0);
System.out.println(result3+"被删除");
System.out.println("剩下数据:"+list);
System.out.println("--------------------");
//改
System.out.println("将0索引的数据改为333");
String result4 = list.set(0,"333");
System.out.println(result4+"被更改");
System.out.println("更改后的数据为:"+list);
System.out.println("----------------------");
//查
System.out.println("获取1索引的数据和集合的长度");
System.out.println("获取1索引的数据为::"+list.get(1));
System.out.println("集合的长度为:"+list.size());
}
}