当我调用从函数调用中接收到的对象的toString
方法时,我得到了这个结果。我知道对象的类型在这个字符串中被编码了,但是我不知道如何读取它。
这种编码方式叫做什么?
[Ljava.lang.Object;
是 Object[].class
的名称,它是表示 Object
数组的类的java.lang.Class
。
这种命名方案在Class.getName()
中有记录:
如果此类对象表示非数组类型的引用类型,则返回类的二进制名称,如Java语言规范所指定的一样(§13.1)。
如果该类对象表示原始类型或
void
,则返回的名称是与原始类型或void
相对应的Java语言关键字。如果该类对象表示数组类,则名称的内部形式由表示数组嵌套深度的一个或多个
'['
字符和元素类型名称的名称前缀组成。元素类型名称的编码如下:你的名字是该列表中最后一个。以下是一些示例:
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
继承的该方法,该方法被指定如下:
Object
类的toString
方法返回一个字符串,由对象实例的类名、'@'字符和对象哈希码的无符号十六进制表示组成。换句话说,此方法返回等于以下值的字符串:注意:您不能依赖于任意对象的
getClass().getName() + '@' + Integer.toHexString(hashCode())
toString()
遵循上述规范,因为它们可以(并且通常会)@Override
它以返回其他内容。检查任意对象类型的更可靠方法是在其上调用getClass()
(从Object
继承的final
方法),然后反射返回的Class
对象。但理想情况下,应该设计API,使得不需要使用反射(请参阅《Effective Java第2版,第53项:优先使用接口而不是反射》)。
有关数组更“有用”的
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
可以通过它们的元素执行数组相等比较,其中包括许多其他与数组相关的实用方法。相关问题
Caused By: Precondition Error
...
Can't detect type of array [Ljava.lang.Short
而且您正在使用
not {
indexExists()
}
sqlCheck
(Postgres)来执行上述检查:SELECT COUNT(i.relname)
FROM
pg_class t,
pg_class i,
pg_index ix
WHERE
t.oid = ix.indrelid
and i.oid = ix.indexrelid
and t.relkind = 'r'
and t.relname = 'tableName'
and i.relname = 'indexName';
tableName
- 是索引表的名称,indexName
- 是索引的名称。