这是什么:[Ljava.lang.Object ;?这是什么:[Ljava.lang.Object

2019-06-17 09:52发布

我得到这个当我打电话toString我从一个函数调用接收的对象。 我知道对象的类型在这个字符串编码,但我不知道如何读它。

这是什么类型的编码叫什么名字?

Answer 1:

[Ljava.lang.Object; 是名称Object[].class ,所述java.lang.Class代表类的阵列的Object

命名方案被记录在Class.getName()

如果该类对象表示引用类型不是数组类型,则返回的类的二进制名称,作为由Java语言规范中指定( §13.1 )。

如果该类对象表示一个基本类型或void ,然后返回的名称是相应于原语类型或Java语言关键字void

如果该类对象表示一类阵列的,则该名称的内部形式包括由一个或多个前面的元素类型的名称'['表示该数组嵌套的深度字符。 元素类型名的编码如下:

 Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname; 

你是最后的名单上。 这里有些例子:

// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx

为什么原因toString()对数组方法返回String以这种格式是因为阵列不@Override从继承方法Object如下,其被指定:

所述toString用于类方法Object返回一个由其中的对象是一个实例,该符号字符`的类的名称的字符串@”,并且对象的哈希码的无符号的十六进制表示。 换句话说,此方法返回一个字符串等于的值:

  getClass().getName() + '@' + Integer.toHexString(hashCode()) 

注意 :你不能依靠toString()任意对象的按照上面的说明,因为他们可以(通常) @Override它返回别的东西。 检查的任意对象的类型的更可靠的方法是调用getClass()就可以了(一个final从继承的方法Object ),然后反射返回的上Class对象。 理想的情况是,该API应该已经设计成反射是没有必要的(见有效的Java第二版,第53项:不想界面反射 )。


在一个更“有用” toString数组

java.util.Arrays提供toString重载基本数组和Object[] 另外也deepToString ,你可能要使用嵌套的数组。

这里有些例子:

    int[] nums = { 1, 2, 3 };

    System.out.println(nums);
    // [I@xxxxx

    System.out.println(Arrays.toString(nums));
    // [1, 2, 3]

    int[][] table = {
            { 1, },
            { 2, 3, },
            { 4, 5, 6, },
    };

    System.out.println(Arrays.toString(table));
    // [[I@xxxxx, [I@yyyyy, [I@zzzzz]

    System.out.println(Arrays.deepToString(table));
    // [[1], [2, 3], [4, 5, 6]]

也有Arrays.equalsArrays.deepEquals执行由它们的元素,许多其它的排列相关的实用方法中阵列相等比较。

相关问题

  • Java的满足Arrays.equals()返回二维数组假。 - 深入报道


文章来源: What is this: [Ljava.lang.Object;?