精通 Java ArrayList 方法:完整指南,附示例和真实案例

发布: (2025年12月13日 GMT+8 20:48)
5 min read
原文: Dev.to

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.lengthsocialApps.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 的各种方法能为你构建生产级应用奠定坚实基础。多多练习、动手写代码,让这些动态列表为你所用!

Back to Blog

相关文章

阅读更多 »

数组和字符串操作问题

使用另一个数组反转数组 java class Main { public static void mainString args { int num = {10, 11, 12, 13, 14, 15, 16}; System.out.println'Original...

面向初学者的 Java 后端项目

Forem 标志 https://media2.dev.to/dynamic/image/width=65,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%...