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

当我从一个函数调用收到的对象上调用toString时,我得到了这个。 我知道对象的types是用这个string编码的,但我不知道如何读取它。 什么是这种types的编码称为?

[Ljava.lang.Object;Object[].class的名称,表示Object的数组Object[].classjava.lang.Class

命名schemelogging在Class.getName()

如果此类对象表示不是数组types的引用types,则按照Java语言规范(第13.1节 )的规定,返回该类的二进制名称。

如果这个类对象表示一个原始types或void ,那么返回的名称就是对应于原始types或void的Java语言关键字。

如果这个类对象表示一个数组类,那么这个名称的内部forms就是由一个或多个代表数组嵌套深度的'['字符前面的元素types名称组成的。 元素types名称的编码如下所示:

 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的原因是因为数组不包含从Objectinheritance的方法,该方法如下所示:

ObjecttoString方法返回一个string,该对象是实例的类名,符号字符“@”和对象的哈希码的无符号hex表示forms。 换句话说,这个方法返回一个string,其值等于:

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

注意 :你不能依赖于任何对象的toString()来遵循上面的规范,因为它们可以(而且通常是) @Override它返回别的东西。 检查任意对象types的更可靠方法是调用其上的getClass() (从Objectinheritance的final方法),然后reflection返回的Class对象。 理想情况下,API应该被devise成不需要reflection(请参阅Effective Java第2版,第53项:优先考虑reflection接口 )。


在数组上更“有用”的toString

java.util.Arrays为基本数组和Object[]提供了toString重载。 还有一个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()返回false。 – 深入报道