java的arraylist集合
一、ArrayList 是什么?
-
动态数组:ArrayList 是 Java 中一个可动态调整大小的数组,属于
java.util
包。 -
与普通数组的区别:普通数组长度固定,而 ArrayList 可以自动扩容。
-
泛型支持:可以存储任意类型的对象(需指定泛型,如
ArrayList<String>
)。
二、基本操作(代码示例)
1. 创建 ArrayList
import java.util.ArrayList; public class Main {public static void main(String[] args) {// 创建一个存储 String 的 ArrayListArrayList<String> names = new ArrayList<>(); // 创建一个存储 Integer 的 ArrayListArrayList<Integer> numbers = new ArrayList<>();} }
2. 添加元素
names.add("Alice"); // 添加到末尾 names.add(0, "Bob"); // 在索引 0 处插入 // 现在列表内容:["Bob", "Alice"]
3. 访问元素
String first = names.get(0); // 获取索引 0 的元素("Bob")
4. 修改元素
names.set(1, "Charlie"); // 将索引 1 改为 "Charlie" // 现在列表内容:["Bob", "Charlie"]
5. 删除元素
names.remove(0); // 删除索引 0 的元素("Bob") names.remove("Charlie"); // 直接删除元素 "Charlie"
6. 获取长度
int size = names.size(); // 当前列表长度
7. 遍历 ArrayList
// 方法 1:普通 for 循环 for (int i = 0; i < names.size(); i++) {System.out.println(names.get(i)); } // 方法 2:增强 for 循环(推荐) for (String name : names) {System.out.println(name); } // 方法 3:使用迭代器 Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) {System.out.println(iterator.next()); }
三、ArrayList 的特点
-
动态扩容:默认初始容量为 10,当元素超过容量时,自动增加 50%(如 10 → 15 → 22 ...)。
-
随机访问快:通过索引访问元素的时间复杂度是 O(1)。
-
增删元素慢:在中间插入或删除元素需要移动后续元素,时间复杂度 O(n)。
四、常见方法速查表
方法 | 作用 |
---|---|
add(E e) | 添加元素到末尾 |
add(int index, E e) | 在指定位置插入元素 |
get(int index) | 获取索引处的元素 |
set(int index, E e) | 修改索引处的元素 |
remove(int index) | 删除索引处的元素 |
remove(Object o) | 删除指定元素(首次出现) |
size() | 返回列表长度 |
contains(Object o) | 判断是否包含某元素 |
clear() | 清空列表 |
五、使用场景
-
当需要频繁访问元素,但较少插入/删除时(如缓存数据)。
-
需要动态调整集合大小时(代替传统数组)。
六、注意事项
-
非线程安全:多线程环境下推荐使用
Vector
或Collections.synchronizedList()
。 -
存储对象类型:只能存储对象(如
Integer
、String
),不能存储基本类型(如int
、char
)。 -
初始容量优化:如果预先知道数据量较大,可通过
new ArrayList<>(100)
指定初始容量,减少扩容次数。
七、练习题目
-
创建一个存储整数的 ArrayList,添加 10 个随机数,然后计算它们的总和。
-
编写一个方法,接收一个 ArrayList<String>,返回所有长度大于 5 的字符串。
如果有任何疑问,或需要更深入的示例,请随时告诉我!我们可以一步步完善你的理解。
在 Java 的 ArrayList
中查找某个数(或对象),可以通过以下几种方法实现:
1. 使用 contains()
方法
判断集合中是否包含指定元素(返回 true
/false
)。
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(5, 3, 8, 2, 7)); int target = 8; if (numbers.contains(target)) {System.out.println("找到了 " + target); } else {System.out.println("没找到 " + target); }
2. 使用 indexOf()
方法
返回元素在集合中的索引(未找到返回 -1
)。
int index = numbers.indexOf(target); if (index != -1) {System.out.println(target + " 的索引是: " + index); } else {System.out.println(target + " 不存在"); }
3. 手动遍历查找
如果需自定义查找逻辑(例如找大于某值的数),可以用循环遍历:
boolean found = false; for (int num : numbers) {if (num == target) {found = true;break;} } System.out.println(found ? "存在" : "不存在");
4. 使用 Java 8 Stream API
通过 filter
和 findFirst
实现更灵活的查找:
Optional<Integer> result = numbers.stream().filter(n -> n == target).findFirst(); if (result.isPresent()) {System.out.println("找到了: " + result.get()); } else {System.out.println("没找到"); }
注意事项
-
对象比较:如果
ArrayList
存储的是自定义对象(如Person
),需要正确重写equals()
方法,否则contains()
和indexOf()
无法正确比较。 -
基本类型:ArrayList 不能直接存储基本类型(如
int
),需使用包装类(如Integer
)。 -
性能:
contains()
和indexOf()
的时间复杂度是 O(n)(需要遍历列表)。
完整示例
import java.util.ArrayList; import java.util.Arrays; public class Main {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(5, 3, 8, 2, 7));int target = 8; // 方法1: contains()System.out.println("是否包含8? " + numbers.contains(target)); // 方法2: indexOf()int index = numbers.indexOf(target);System.out.println("8的索引是: " + index); // 方法3: 遍历for (int num : numbers) {if (num == target) {System.out.println("通过遍历找到8");break;}}} }
输出结果:
是否包含8? true 8的索引是: 2 通过遍历找到8
如果有其他具体需求(如查找多个符合条件的数),可以进一步优化代码!