Java含混合类型与int数组的ArrayList元素访问、打印及循环实现问题
针对你遇到的Java开发问题的具体解答
1. 不通过循环从ArrayList内嵌int数组中获取指定值
- 只要你明确知道目标值在int数组中的固定下标,完全不需要循环就能拿到值:
- 先定位到ArrayList中存储int数组的位置(你的例子里是下标为2的元素),将该位置的Object类型元素强转回
int[]类型 - 直接通过数组下标访问对应值即可
- 先定位到ArrayList中存储int数组的位置(你的例子里是下标为2的元素),将该位置的Object类型元素强转回
- 甚至可以用一行代码一步取出目标值,不需要定义中间变量:
// 直接拿到数组中下标为2的元素,也就是你要的55 int targetValue = ((int[]) strangeList.get(2))[2]; - 注意:如果不知道目标值在数组里的固定下标,不管是不是嵌套在ArrayList中,都需要遍历数组才能匹配到目标值,这和ArrayList本身的存储结构无关。
2. int数组输出显示[I@2401f4c3的原因和解决方法
- 出现这类地址格式输出的原因:Java中的数组是JVM层面的特殊对象,默认继承Object类的
toString()实现,输出格式就是「类型标识@对象哈希值」,其中[I就代表int类型数组,后面的十六进制串是对象的内存地址。 - 完全不需要重写数组的toString方法:Java的数组类型是不可被继承的,你根本无法创建自定义数组子类来重写它的方法,强行实现反而会抛出语法错误。
- 正确输出数组实际内容的方式:
调用JDK自带的Arrays.toString()工具方法即可,传入数组对象就会按照[元素1, 元素2, ...]的格式输出内容,比如:// 提前导入java.util.Arrays类 int[] embeddedArr = (int[]) strangeList.get(2); System.out.println(Arrays.toString(embeddedArr)); // 输出结果:[329, 23882, 55, 932]
3. for循环打印逻辑仅输出1次数组内容的问题
- 先逐行拆解你现有代码的实际执行逻辑,就能找到问题根源:
- 外层循环遍历ArrayList的下标i,取值范围是0、1、2(因为列表长度为3)
- 循环内部的判断条件是
i == 2,也就是只有当i取到2的时候,才会进入内层循环 - 你写的内层循环是遍历ArrayList本身的下标j,取值范围是0、1、2,每次打印对应位置的列表元素——也就是依次打印字符串"String"、整数3823、整个int数组对象本身
- 这种逻辑下,你根本没有进入数组内部遍历它的4个元素,只是把整个数组对象作为列表的一个元素打印了1次,自然达不到预期的打印4次数组内容的效果。另外你内层循环的边界选错了,用了ArrayList的长度3,而不是int数组本身的长度4,从范围上就不可能遍历到4个元素。
- 修正后的核心逻辑:当定位到列表里的数组元素时,先把元素强转回int数组类型,再内层遍历数组本身的长度范围,逐次打印数组元素,代码示例:
for (int i = 0; i < strangeList.size(); i++) { // 定位到存储int数组的列表位置 if (i == 2) { int[] arr = (int[]) strangeList.get(i); // 内层循环遍历数组的4个元素,逐个打印 for (int j = 0; j < arr.length; j++) { System.out.println(arr[j]); } } }
内容的提问来源于stack exchange,提问作者E.Y.309
相关产品推荐
相关产品推荐

