开发者社区 问答 正文

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

当我调用toString从函数调用中收到的对象时,会得到此信息。我知道对象的类型编码在此字符串中,但是我不知道如何读取它。

这种编码称为什么类型? 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 10:53:46 541 分享 版权
1 条回答
写回答
取消 提交回答
  • [Ljava.lang.Object;是的名称Object[].class,java.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; 您的是该列表中的最后一个。这里有些例子:

    // 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用于类Object的方法返回一个字符串,该字符串由对象作为实例的类的名称,符号字符“ @”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回的字符串等于:

    getClass().getName() + '@' + Integer.toHexString(hashCode()) 注意:您不能依赖toString()任何任意对象来遵循上述规范,因为它们可以(通常这样做)@Override返回其他内容。检查任意对象类型的更可靠方法是getClass()在其上调用(final从继承的方法Object),然后在返回的对象上进行反射Class。不过,理想情况下,API的设计应该使得不需要反射(请参阅 Effective Java 2nd Edition,第53项:首选反射接口)。

    toString对数组更“有用” java.util.Arrays提供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]] 在许多其他与数组相关的实用程序方法中,还有Arrays.equals和Arrays.deepEquals通过它们的元素执行数组相等性比较。

    2020-02-08 10:54:08
    赞同 展开评论
问答地址: