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
实现类,如ArrayList
或LinkedList
。 - ✅ 若删除操作频繁,且集中在头部,
LinkedList.remove(0)
是最高效的选择。 - ⚠️ 技术选型不能只看单一操作性能,要结合整体使用模式权衡。
📌 最终建议:能不用数组就不硬扛,早用 List 早轻松。