1. 概述

在本文中,我们将探讨如何在Java中删除数组的第一个元素。

同时,我们也会对比使用 Java 集合框架(Java Collections Framework)中的数据结构来实现相同目标的更优方案。对于频繁进行增删操作的场景,集合类往往比原生数组更加灵活高效。

✅ 提示:如果你经常需要对“数组”做增删操作,那你真正需要的可能不是一个数组,而是 List


2. 使用 Arrays.copyOfRange()

⚠️ 首先必须明确一点:Java 中无法直接删除数组元素

根据官方文档定义:

“数组是一个固定长度的容器对象,创建后其长度不可改变。”

这意味着,只要还在直接使用数组,所谓的‘删除’就只能通过创建一个更小的新数组来实现,原数组本身不会被修改。

JDK 提供了一个便捷的工具方法 Arrays.copyOfRange(),可以帮我们快速完成这个任务:

String[] stringArray = {"foo", "bar", "baz"};
String[] modifiedArray = Arrays.copyOfRange(stringArray, 1, stringArray.length);

执行后,modifiedArray 的内容为 {"bar", "baz"} —— 成功跳过了第一个元素。

关键点:

  • ✅ 用法简单,无需引入第三方库
  • ❌ 时间复杂度为 *O(n)*,每次都要复制整个剩余元素
  • ❌ 原数组不变,需手动接管返回的新数组
  • ⚠️ 适合一次性操作,不适合高频删除场景

💡 踩坑提醒:别忘了起始索引是 1,而不是 0,否则会包含第一个元素。


3. 使用 List 实现类替代数组

如果需要频繁删除或插入元素,建议改用集合框架中的 List 接口实现类。它们天然支持动态扩容和元素删除,语义更清晰,代码更简洁。

常用的实现有:

  • ArrayList
  • LinkedList

两者都实现了 List 接口,因此删除第一个元素的写法完全一致:

List<String> arrayList = new ArrayList<>();
arrayList.add("foo");
arrayList.add("bar");
arrayList.add("baz");
arrayList.remove(0); // 删除第一个元素

List<String> linkedList = new LinkedList<>();
linkedList.add("foo");
linkedList.add("bar");
linkedList.add("baz");
linkedList.remove(0); // 删除第一个元素

执行后,两个列表均只剩下 ["bar", "baz"]

性能对比:

操作 ArrayList LinkedList
remove(0)(删除首元素) O(n) ✅ O(1)
get(i)(随机访问) ✅ O(1) O(n)
  • LinkedList 删除头节点非常高效,因为只需要调整指针;
  • ArrayList 删除第一个元素需要将后续所有元素前移一位,开销较大。

如何选择?

  • ✅ 频繁随机访问 + 少量删除 → 选 ArrayList
  • ✅ 频繁首尾增删 + 不太关心索引访问速度 → 选 LinkedList
  • ❌ 不要盲目认为 LinkedList 万能,它的 get(i) 性能很差

💬 经验之谈:大多数业务场景下,ArrayList 依然是首选。除非你明确在做队列、栈这类以增删为主的操作。


4. 结论

  • ❌ 数组本身不能删除元素,只能通过 Arrays.copyOfRange() 创建新数组来模拟删除,性能为 *O(n)*。
  • ✅ 更合理的做法是改用 List 实现类,如 ArrayListLinkedList
  • ✅ 若删除操作频繁,且集中在头部,LinkedList.remove(0) 是最高效的选择。
  • ⚠️ 技术选型不能只看单一操作性能,要结合整体使用模式权衡。

📌 最终建议:能不用数组就不硬扛,早用 List 早轻松


原始标题:Removing the First Element of an Array | Baeldung