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

Lan*_*uhn 105 java arrays class tostring

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

这种类型的编码叫什么?

pol*_*nts 205

[Ljava.lang.Object;是名称Object[].classjava.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;
Run Code Online (Sandbox Code Playgroud)

你的是这个名单上的最后一个.这里有些例子:

// 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
Run Code Online (Sandbox Code Playgroud)

toString()数组上的方法String以这种格式返回的原因是因为数组不是@Override从中继承的方法Object,其指定如下:

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

getClass().getName() + '@' + Integer.toHexString(hashCode())
Run Code Online (Sandbox Code Playgroud)

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


toString对数组更"有用"

java.util.ArraystoString为原始数组提供重载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]]
Run Code Online (Sandbox Code Playgroud)

还存在Arrays.equals并且Arrays.deepEquals通过其元素执行数组相等性比较,以及许多其他与数组相关的实用程序方法.

相关问题

  • 感谢您在网上创建_the_ goto答案. (21认同)