精通 Java ArrayList 方法:完整指南,附示例和真实案例
Source: Dev.to
实际上什么是 ArrayList?
在内部,ArrayList 仍然使用数组,但它会为你处理所有的扩容逻辑。当空间不足时,它会创建一个更大的数组并把所有内容复制过去。结果就是一个 动态数组,既提供了快速的基于索引的访问,又拥有列表的灵活性。
为什么要在意?
- 你事先不知道会有多少元素。
- 需要频繁添加/删除元素。
- 仍然想要快速的随机访问(例如,获取第 5 位的元素)。
- 你不需要其他集合的超特化功能(例如,
LinkedList用于在两端常数时间插入,或HashSet用于唯一性)。
必备的 ArrayList 方法,配合真实代码解读
基础:添加和访问
add(E element) & add(int index, E element)
ArrayList socialApps = new ArrayList<>();
socialApps.add("Instagram"); // 添加到末尾
socialApps.add("Twitter");
socialApps.add(1, "TikTok"); // 在索引 1 处插入
// 现在的顺序: ["Instagram", "TikTok", "Twitter"]
真实场景: 根据用户权限在 Android 应用中动态生成菜单列表。
get(int index)
String currentFav = socialApps.get(0); // "Instagram"
小技巧: 在生产环境中始终检查边界或使用安全方法,以避免 IndexOutOfBoundsException。
set(int index, E element)
socialApps.set(2, "Snapchat"); // 替换索引 2 处的元素
了解内部内容:检查与查找
- size() – 替代
array.length。socialApps.size()返回3。 - isEmpty() – 若列表不包含任何元素则返回
true。 - contains(Object o) & indexOf(Object o)
boolean hasTikTok = socialApps.contains("TikTok"); // true
int pos = socialApps.indexOf("Instagram"); // 0
真实场景: 在用户注册前验证用户名是否已存在。
清理工作:删除元素
remove(int index) & remove(Object o)
socialApps.remove(1); // 按索引删除 "TikTok"
socialApps.remove("X"); // 尝试按对象删除 "X"
注意:
remove(1)按索引删除,而remove(Integer.valueOf(1))才是删除列表中数值1。
clear() – 删除所有元素,使列表为空。
socialApps.clear(); // 列表现在为空
进阶:批量操作与遍历
addAll(Collection c) – 像高手一样合并列表。
ArrayList newApps = new ArrayList<>(Arrays.asList("Threads", "Bluesky"));
socialApps.addAll(newApps);
subList(int fromIndex, int toIndex) – 获取列表的一段 视图(不是副本),适用于分页。
遍历 ArrayList
// For‑each(最简洁)
for (String app : socialApps) {
System.out.println(app);
}
// Iterator(在循环中安全删除)
Iterator it = socialApps.iterator();
while (it.hasNext()) {
if (it.next().contains("a")) {
it.remove(); // 在遍历时安全删除
}
}
// Java 8+ forEach + lambda(更清晰)
socialApps.forEach(app -> System.out.println(app));
Initial Capacity – 如果你知道大概会存放 10 000 条数据,可使用 new ArrayList<>(10000),避免频繁扩容。
性能说明
get(index)和set(index, element)的时间复杂度是 O(1) – 常数时间。add(element)的时间复杂度是 O(1) 摊销(通常很快;偶尔的扩容会导致一次复制)。add(index, element)和remove(index)的时间复杂度是 O(n) – 当在列表前部操作时会因为元素搬移而变慢。- 同步问题:
ArrayList不是线程安全的。若多线程访问,请使用Collections.synchronizedList(new ArrayList<>())或并发集合。 - 复制:
new ArrayList<>(oldList)只创建浅拷贝,内部对象在两个列表之间共享。
真实案例:电商购物车
ArrayList cart = new ArrayList<>();
// 用户添加商品
cart.add(new CartItem("Java Programming Book", 1, 29.99));
cart.add(new CartItem("USB‑C Cable", 2, 15.99));
// 更新第一件商品的数量
CartItem firstItem = cart.get(0);
firstItem.setQuantity(2);
// 用户删除商品
cart.removeIf(item -> item.getName().contains("Cable")); // 删除所有包含 “Cable” 的商品
// 结算 – 计算总价
double total = 0;
for (CartItem item : cart) {
total += item.getPrice() * item.getQuantity();
}
// 订单完成后清空购物车
cart.clear();
FAQ
- Q: 2024 年该用 Array 还是 ArrayList?
- Q: 如何对 ArrayList 进行排序?
- Q: 能在 ArrayList 中存放基本类型吗?
- Q: ArrayList 的内存使用效率如何?
总结
集合是专业 Java 开发的核心组成部分。掌握 ArrayList 的各种方法能为你构建生产级应用奠定坚实基础。多多练习、动手写代码,让这些动态列表为你所用!