Answers:
[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的设计应该使得不需要反射(请参见 Effective Java 2nd Edition,第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.equals
和Arrays.deepEquals
在许多其他与数组相关的实用程序方法通过它们的元素执行数组相等性比较。