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

122

当我调用从函数调用中接收到的对象的toString方法时,我得到了这个结果。我知道对象的类型在这个字符串中被编码了,但是我不知道如何读取它。

这种编码方式叫做什么?

2个回答

234

[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.equalsArrays.deepEquals可以通过它们的元素执行数组相等比较,其中包括许多其他与数组相关的实用方法。

相关问题


1
如果您因Liquibase错误而来到这里,请注意以下内容:
Caused By: Precondition Error
...
Can't detect type of array [Ljava.lang.Short

而且您正在使用

not {
  indexExists()
}

如果你在多个前提条件中多次使用,则可能面临旧bug: https://liquibase.jira.com/browse/CORE-1342 我们可以尝试使用裸的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 - 是索引的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接