在Java编程中,处理数组是常见操作之一,而获取数组末尾的两个元素可能涉及多种场景,如数据分析、算法实现或业务逻辑处理,本文将系统介绍几种高效且安全的方法来实现这一需求,涵盖基础数组操作、Java 8 Stream API以及第三方库的使用,同时讨论边界条件和性能考量,帮助开发者根据实际场景选择最优方案。

基础数组操作:索引直接访问
对于Java基础数组(即原生数组类型,如int[]、String[]等),最直接的方式是通过索引访问末尾元素,数组的索引从0开始,因此最后一个元素的索引为length - 1,倒数第二个元素的索引为length - 2,这种方法无需额外依赖,代码简洁,但需要先检查数组长度是否足够,避免数组越界异常。
实现步骤:
- 检查数组是否为
null或长度小于2,若满足条件则无法获取两个元素,需抛出异常或返回默认值。 - 通过索引
array.length - 2和array.length - 1分别获取倒数第二个和最后一个元素。
示例代码:
public int[] getLastTwoElements(int[] array) {
if (array == null || array.length < 2) {
throw new IllegalArgumentException("数组长度不足或为null");
}
return new int[]{array[array.length - 2], array[array.length - 1]};
}
优点: 效率高,时间复杂度为O(1),适合性能敏感场景。
注意事项: 必须进行边界检查,否则当数组长度小于2时会抛出ArrayIndexOutOfBoundsException。
使用System.arraycopy方法批量复制
如果需要将末尾的两个元素复制到新数组中,可以使用System.arraycopy方法,该方法底层由本地代码实现,效率较高,通过指定源数组、起始位置、目标数组及长度,可以灵活提取数组片段。
实现步骤:
- 检查数组有效性及长度。
- 创建长度为2的目标数组。
- 调用
System.arraycopy,从源数组的length - 2位置开始复制2个元素到目标数组。
示例代码:

public String[] getLastTwoElements(String[] array) {
if (array == null || array.length < 2) {
return new String[0]; // 返回空数组表示无结果
}
String[] result = new String[2];
System.arraycopy(array, array.length - 2, result, 0, 2);
return result;
}
优点: 批量复制效率高,适合需要提取连续多个元素的场景。
缺点: 需要预先创建目标数组,代码量略多于直接索引访问。
Java 8 Stream API:灵活处理动态数据
对于集合类(如List)或需要更灵活处理的场景,Java 8引入的Stream API提供了一种函数式编程的解决方案,通过stream()、skip和limit方法,可以轻松截取数组末尾的元素。
实现步骤:
- 将数组转换为Stream(
Arrays.stream(array))。 - 使用
skip(length - 2)跳过前length - 2个元素。 - 使用
limit(2)限制只取2个元素。 - 将结果收集到新数组中(
toArray)。
示例代码:
import java.util.Arrays;
public double[] getLastTwoElements(double[] array) {
if (array == null || array.length < 2) {
return new double[0];
}
return Arrays.stream(array)
.skip(array.length - 2)
.limit(2)
.toArray();
}
优点: 代码简洁,可读性强,适合处理复杂逻辑(如过滤、转换后再截取)。
缺点: Stream操作存在一定的性能开销,不适合对性能要求极高的场景。
第三方库:Apache Commons Lang简化操作
在实际项目中,使用第三方库可以减少重复代码,提高开发效率,Apache Commons Lang库中的ArrayUtils类提供了丰富的数组操作方法,其中subarray方法可直接截取数组片段。
依赖引入(Maven):

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
实现步骤:
- 检查数组有效性。
- 调用
ArrayUtils.subarray(array, array.length - 2, array.length),其中第三个参数为结束索引(不包含)。
示例代码:
import org.apache.commons.lang3.ArrayUtils;
public Object[] getLastTwoElements(Object[] array) {
if (array == null || array.length < 2) {
return ArrayUtils.EMPTY_OBJECT_ARRAY;
}
return ArrayUtils.subarray(array, array.length - 2, array.length);
}
优点: 代码极简,无需手动处理边界条件(库内部已处理),适合快速开发。
缺点: 增加项目依赖,需权衡维护成本。
边界条件与异常处理
无论采用哪种方法,边界条件处理都是关键,常见边界情况包括:
- 数组为null:需抛出
NullPointerException或返回空数组/默认值,避免后续操作报错。 - 数组长度不足2:根据业务需求选择抛出异常、返回空数组或仅能获取到的元素(如长度为1时返回该元素)。
- 空数组:与长度不足2的情况类似,需明确业务逻辑。
推荐实践:
- 在公共方法中严格校验参数,抛出明确的异常(如
IllegalArgumentException)。 - 在业务逻辑中,根据需求决定是否使用Optional或空数组作为返回值,避免调用方频繁判断null。
性能对比与场景选择
| 方法 | 时间复杂度 | 代码简洁度 | 适用场景 |
|---|---|---|---|
| 索引直接访问 | O(1) | 高 | 基础数组,性能敏感场景 |
| System.arraycopy | O(1) | 中 | 需要批量复制连续元素 |
| Stream API | O(n) | 高 | 集合类或需复杂处理的动态数据 |
| Apache Commons Lang | O(1) | 极高 | 快速开发,项目已引入依赖 |
- 性能优先:选择索引直接访问或
System.arraycopy。 - 代码简洁性优先:选择Stream API或第三方库。
- 动态数据/复杂逻辑:优先考虑Stream API。
获取Java数组末尾的两个元素,方法多样且各有优劣,基础数组操作适合简单高效的需求,Stream API提供了灵活的函数式支持,而第三方库则能大幅简化代码,开发者需根据实际场景(如性能要求、代码可维护性、项目依赖)选择合适的方法,同时注重边界条件处理,确保代码的健壮性,通过合理选择和优化,可以高效、安全地实现数组末尾元素的提取,为后续业务逻辑提供可靠的数据支持。



















