一维数组tmp1与二维数组tmp2输出结果一致的原因探究
问题:一维数组与二维数组输出结果相同的原因
以下是出现问题的Java代码:
package hosein.testFile; import java.util.*; import java.io.*; /** * * @author hosein */ public class Main2 implements Serializable { /** * @param args the command line arguments */ public static void main(String[] args) { // part 1 ---------------------------------------------------- ArrayList s = new ArrayList<>(); ArrayList<String> d = new ArrayList<>(); ArrayList<String> b = new ArrayList<>(); d.add("a"); d.add("b"); b.add("c"); b.add("d"); b.add("e"); Collections.addAll(s, d, b); Object[] tmp1 = s.toArray(); System.out.println("tmp1 :" + Arrays.toString(tmp1)); // part 2 ---------------------------------------------------- Object[][] tmp2 = new Object[2][]; tmp2[0] = new Object[2]; tmp2[1] = new Object[3]; Object[] dTmp = d.toArray(); Object[] bTmp = b.toArray(); for (int i = 0; i < tmp2.length; i++) { for (int j = 0; j < tmp2[i].length; j++) { if (i == 0) { tmp2[i][j] = dTmp[j]; } if (i == 1) { tmp2[i][j] = bTmp[j]; } } } System.out.println("tmp2 :" + Arrays.toString(tmp1)); } }
运行后输出结果如下:
run: tmp1 :[[a, b], [c, d, e]] tmp2 :[[a, b], [c, d, e]] BUILD SUCCESSFUL (total time: 0 seconds)
原因分析
输出变量写错是直接原因:
观察代码中输出tmp2的语句:System.out.println("tmp2 :" + Arrays.toString(tmp1));,这里传入Arrays.toString的参数是tmp1而非tmp2,本质上两次输出的都是同一个一维数组tmp1的内容,结果自然完全相同。补充:若输出tmp2,视觉上也会类似的原因:
假设修正语句为Arrays.toString(tmp2),输出结果依然会是[[a, b], [c, d, e]]。这是因为Arrays.toString处理数组时,会对数组中的每个元素调用其toString方法:- 对于一维数组
tmp1,它的元素是ArrayList对象,ArrayList的toString会输出内部元素组成的字符串(如[a, b]); - 对于二维数组
tmp2,它本质是“元素为一维数组的一维数组”,Arrays.toString会对每个一维数组元素调用数组的toString方法,而数组的toString默认输出格式也是[元素1, 元素2,...],所以视觉上和tmp1的输出一致。但两者的数组结构完全不同:tmp1是Object[],每个元素是ArrayList;tmp2是Object[][],每个元素是Object[]。
- 对于一维数组
内容的提问来源于stack exchange,提问作者hosein javid
相关产品推荐
相关产品推荐

