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

时间:2010-08-09 16:28:42

标签: java arrays class tostring

当我在函数调用中收到的对象上调用toString时,我得到了这个。我知道对象的类型是用这个字符串编码的,但我不知道如何阅读它。

这种类型的编码是什么?

2 个答案:

答案 0 :(得分:194)

[Ljava.lang.Object;Object[].class的名称,java.lang.Class代表Object数组的类。

命名方案记录在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的原因是因为数组不@Override继承自Object的方法,其指定如下:

  

toString method for class Object返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串:

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

注意 :您不能依赖任何任意对象的toString()来遵循上述规范,因为它们可以(并且通常会){{ 1}}它返回别的东西。检查任意对象类型的更可靠方法是在其上调用getClass()(从@Override继承的final方法),然后在返回的{reflecting上调用java.util.Arrays 1}}对象。但理想情况下,API应该设计为不需要反射(参见 Effective Java 2nd Edition,Item 53:Prefer接口到反射)。


对数组

更“有用”Object

Java Arrays.equals() returns false for two dimensional arrays.为原始数组和Class提供toString重载。您可能还希望将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]] 通过其元素执行数组相等性比较,以及许多其他与数组相关的实用程序方法。

相关问题

  • {{3}} - 深入报道

答案 1 :(得分:0)

如果您因为Liquibase错误而在这里:

Caused By: Precondition Error
...
Can't detect type of array [Ljava.lang.Short

您正在使用

not {
  indexExists()
}

多次进行前提条件,那么您将面临一个旧错误: 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-是索引名称