黑马程序员技术交流社区

标题: 关于数组反射的问题 [打印本页]

作者: Jam-l    时间: 2013-9-26 16:12
标题: 关于数组反射的问题
本帖最后由 杨增坤 于 2013-9-27 07:31 编辑

  按理说 int[] 是一个Object ,String 也是Object , int[][] 和String[] 就是Object[] 。但是用 Arrays.asList() 取出列表时 ,为什么 String[] a4 可以取出里面的值 Integer[] a5 也可以取出里面的值,

但是 int[][] a6 里的值就取不出来,要怎么才能把 int[][] a6 里的值取出?
  1. import java.util.Arrays;

  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 int[] a1 = new int[]{1,2,3};
  5.                 int[] a2 = new int[4];
  6.                 int[][] a3 = new int[2][3];
  7.                 String[] a4 = new String[]{"a","b","c"};
  8.                 Integer[] a5 = new Integer[]{1,2,3};
  9.                 int[][] a6 = {{1},{2},{3}};
  10.                
  11.                 //比较字节码是否相等
  12.                 System.out.println(a1.getClass() == a2.getClass());
  13.                 //System.out.println(a1.getClass() == a3.getClass()); 编译时出错
  14.                 //System.out.println(a1.getClass() == a4.getClass()); 编译时出错
  15.                
  16.                 //获取a1的字节码的名字 :[I 整形数组
  17.                 System.out.println(a1.getClass().getName());
  18.                 //获取a1父类的字节码的名字 :java.lang.Object
  19.                 System.out.println(a1.getClass().getSuperclass().getName());
  20.                 //获取a4父类的字节码的名字 :java.lang.Object  
  21.                 System.out.println(a4.getClass().getSuperclass().getName());
  22.                
  23.                 //以下可以得出int[]和String是Object ,而int[][]和String[]是Object[]
  24.                 Object obj1 = a1;
  25.                 Object obj2 = a2;
  26.                 //Object[] obj3 = a1; 编译时出错
  27.                 Object[] obj4 = a4;
  28.                 Object[] obj5 = a4;
  29.                
  30.                 System.out.println(a1); //[I@145c859
  31.                 System.out.println(a4); //[Ljava.lang.String;@64883c
  32.                 System.out.println(Arrays.asList(a1)); //[[I@145c859] int[]是Object,所以返回的一个对象的列表
  33.                 System.out.println(Arrays.asList(a4)); //[a, b, c]   String[]是Object[],所以返回是多个对象的列表
  34.                 System.out.println(Arrays.asList(a5)); //[1, 2, 3]   Integer[]是Object[],所以返回是多个对象的列表
  35.                 System.out.println(Arrays.asList(a6)); //[[I@785d65, [I@3bc257, [I@153f67e] int[][]是Object[],所以返回是多个对象的列表
  36.         }
  37. }
复制代码

作者: lizhangzhi    时间: 2013-9-26 17:28
a6是二维数组,就是数组中包含数组,所以a6中有三个int[],int[]是object,System.out.println(Arrays.asList(a6));这句话打印的是a6中每个int[]的哈希值;Integer对应的是object[]
,我把a6类型改成Integer,最后打印a6中的每个数组;
  1. import java.util.Arrays;

  2. public class Test {

  3.         private static Integer[] integers;

  4.                 public static void main(String[] args) {
  5.                 int[] a1 = new int[]{1,2,3};
  6.                 int[] a2 = new int[4];
  7.                 int[][] a3 = new int[2][3];
  8.                 String[] a4 = new String[]{"a","b","c"};
  9.                Integer[] a5 = new Integer[]{1,2,3};
  10.                Integer[][] a6 = {{1},{2},{3}};
  11.             
  12.                 //比较字节码是否相等
  13.                 System.out.println(a1.getClass() == a2.getClass());
  14.                 //System.out.println(a1.getClass() == a3.getClass()); 编译时出错
  15.                 //System.out.println(a1.getClass() == a4.getClass()); 编译时出错
  16.                
  17.                 //获取a1的字节码的名字 :[I 整形数组
  18.                 System.out.println(a1.getClass().getName());
  19.                 //获取a1父类的字节码的名字 :java.lang.Object
  20.                 System.out.println(a1.getClass().getSuperclass().getName());
  21.                 //获取a4父类的字节码的名字 :java.lang.Object  
  22.                 System.out.println(a4.getClass().getSuperclass().getName());
  23.                
  24.                 //以下可以得出int[]和String是Object ,而int[][]和String[]是Object[]
  25.                 Object obj1 = a1;
  26.                 Object obj2 = a2;
  27.                // Object[] obj3 = a1;
  28.                 Object[] obj4 = a4;
  29.                 Object[] obj5 = a4;
  30.                 Arrays.asList();
  31.                 System.out.println(a1); //[I@145c859
  32.                 System.out.println(a4); //[Ljava.lang.String;@64883c
  33.                 System.out.println(Arrays.asList(a1)); //[[I@145c859] int[]是Object,所以返回的一个对象的列表
  34.                 System.out.println(Arrays.asList(a4)); //[a, b, c]   String[]是Object[],所以返回是多个对象的列表
  35.                 System.out.println(Arrays.asList(a5)); //[1, 2, 3]   Integer[]是Object[],所以返回是多个对象的列表
  36.                 System.out.println(Arrays.asList(a6[0])); //[[I@785d65, [I@3bc257, [I@153f67e] int[][]是Object[],所以返回是多个对象的列表
  37.                 System.out.println(Arrays.asList(a6[1])); //[[I@785d65, [I@3bc257, [I@153f67e] int[][]是Object[],所以返回是多个对象的列表
  38.                 System.out.println(Arrays.asList(a6[2])); //[[I@785d65, [I@3bc257, [I@153f67e] int[][]是Object[],所以返回是多个对象的列表
  39.         }
  40. }
复制代码
最后输出一行结果是:[1]     [2]      [3]
这只是我的想法,希望对你有帮助。
作者: Jam-l    时间: 2013-9-26 18:01
lizhangzhi 发表于 2013-9-26 17:28
a6是二维数组,就是数组中包含数组,所以a6中有三个int[],int[]是object,System.out.println(Arrays.asLi ...

谢谢,可以打印出来。我的理解是:把二维整形数组 int[][] 改为二维引用型数组 Integer[][] ,其实就是把对应的Object[] 变成 Object[][] , 然后 a6[0] 就是取出一个Object[] 。System.out.println(Arrays.asList(a6[0])); ,其实就是把 Integer[] 打印出来 ,不知是否正确?


作者: lizhangzhi    时间: 2013-9-26 21:06
对,我就是这么想的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2