Java无需额外内存借助内置函数打印子数组的实现方法
Java无额外内存打印指定范围子数组的实现方案
你需要的不创建子数组副本的实现方式有两类,都可以满足低内存开销的需求,同时兼顾代码简洁性:
方案1:自定义通用工具方法(推荐,性能最优)
直接对原数组的指定索引范围遍历输出,完全不会创建额外的子数组对象,空间复杂度为O(1)(仅占用少量临时变量内存),输出格式可以完全对齐Arrays.toString()的标准格式:
import java.util.Objects; public class ArrayUtils { public static void printSubArray(int[] array, int fromIndex, int toIndex) { // 参数合法性校验 Objects.requireNonNull(array); if (fromIndex < 0 || toIndex >= array.length || fromIndex > toIndex) { throw new IllegalArgumentException("非法索引范围"); } // 输出格式和Arrays.toString保持一致 System.out.print("["); for (int k = fromIndex; k <= toIndex; k++) { System.out.print(array[k]); if (k != toIndex) { System.out.print(", "); } } System.out.println("]"); } }
调用方式非常简洁:
// 示例 i=3,j=6 ArrayUtils.printSubArray(array, 3, 6); // 输出结果:[3, 4, 5, 6]
方案2:Java 8+ Stream流式实现(无需自定义工具类,代码简洁)
通过IntStream遍历索引直接取值,不会创建子数组副本,适合不想额外封装工具类的场景:
简化空格分隔输出:
import java.util.stream.IntStream; // 示例 i=3,j=6 IntStream.rangeClosed(3, 6) .forEachOrdered(k -> System.out.print(array[k] + " ")); // 输出结果:3 4 5 6
标准Arrays.toString格式输出:
import java.util.stream.Collectors; import java.util.stream.IntStream; // 示例 i=3,j=6 String res = IntStream.rangeClosed(3, 6) .mapToObj(k -> String.valueOf(array[k])) .collect(Collectors.joining(", ", "[", "]")); System.out.println(res); // 输出结果:[3, 4, 5, 6]
补充说明
你原本使用的普通for循环本身就已经是无额外子数组内存开销的实现,只是输出格式和复用性不足,上述两种方案都是在保留低内存优势的前提下,优化了代码简洁性和输出格式的适配。
内容的提问来源于stack exchange,提问作者GURU Shreyansh
相关产品推荐
相关产品推荐

