Java数组打印输出[I@xxx乱码问题排查与代码优化建议
代码错误定位
异常输出的根本原因
你看到的[I@36baf30c[I@36baf30c,本质是两个拼接在一起的Java数组默认描述字符串,问题出在main方法的打印逻辑:
- Java中数组是引用类型,直接把数组对象丢给
System.out.print()时,不会输出数组存的实际元素,而是输出类似[I@内存哈希值的格式字符串——[I就代表这是一个int数组。 - 当前循环跑了2次,每次都直接打印整个
result数组对象,压根没取数组里存的最小值、最大值做输出,自然就出了两个连在一起的数组地址类字符串。
隐藏的运行时风险
findMinMax方法本身还有几个容易触发报错的隐患:
- 无入参校验:如果传入的数组是null、数组长度为0、传入的长度参数n比数组实际长度大,会直接触发数组越界或者空指针异常。
- 冗余长度参数:方法额外要求传数组长度n,但Java数组本身自带
length属性,完全可以在方法内部直接获取,多传的参数不仅增加调用方负担,还可能出现传的n和实际数组长度不匹配的问题,比如数组实际长度是4,调用时传n=6,直接就会越界。
优化调整建议
- 修正打印逻辑:把循环里的
System.out.print(result)换成取数组下标的写法System.out.print(result[i] + " "),就能正确打印数组里的min和max;也可以直接引入Arrays.toString()方法,一行代码输出数组全部内容,不用手动写循环遍历。 - 去掉冗余的n参数:方法内部直接用
arr.length获取数组长度,减少传参带来的错误风险。 - 加入前置入参校验:在方法开头判断数组合法性,遇到空数组或者null输入时抛出清晰的参数异常,避免随机抛出底层的越界错误。
- 提升返回值可读性:现在用长度为2的数组存min和max,调用方得专门记
下标0是最小值、下标1是最大值,可读性很差,可以封装一个带min、max字段的简单结果类,让返回值的语义更明确。 - 长数组场景性能优化:如果要处理超长数组,可以换成逐对比较的策略:每次取相邻两个元素,先比出这俩里的小值和大值,小值拿去和当前min比,大值拿去和当前max比,整体比较次数能减少25%,长数组下性能提升很明显。
可正常运行的修正参考代码
import java.util.Arrays; public class Hello { static int[] findMinMax(int arr[]) { // 入参合法性校验 if (arr == null || arr.length == 0) { throw new IllegalArgumentException("输入数组不能为空"); } int min = arr[0]; int max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] < min) { min = arr[i]; } else if (arr[i] > max) { max = arr[i]; } } return new int[]{min, max}; } public static void main(String[] args) { int[] arr = {22, 3, 5, 7, 9, 16}; int[] result = findMinMax(arr); // 直接打印数组实际存储的内容 System.out.println(Arrays.toString(result)); } }
内容的提问来源于stack exchange,提问作者Puja Kumari
相关产品推荐
相关产品推荐

