java:这是什么:[Ljava.lang.Object;?
当我从一个函数调用收到的对象上调用toString
时,我得到了这个。 我知道对象的types是用这个string编码的,但我不知道如何读取它。 什么是这种types的编码称为?
[Ljava.lang.Object;
是Object[].class
的名称,表示Object
的数组Object[].class
的java.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
的原因是因为数组不包含从Object
inheritance的方法,该方法如下所示:
类
Object
的toString
方法返回一个string,该对象是实例的类名,符号字符“@”和对象的哈希码的无符号hex表示forms。 换句话说,这个方法返回一个string,其值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())
注意 :你不能依赖于任何对象的toString()
来遵循上面的规范,因为它们可以(而且通常是) @Override
它返回别的东西。 检查任意对象types的更可靠方法是调用其上的getClass()
(从Object
inheritance的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.equals
和Arrays.deepEquals
,通过它们的元素执行数组相等比较,以及许多其他与数组相关的实用程序方法。
相关问题
- 对于二维数组,Java Arrays.equals()返回false。 – 深入报道