代码之家  ›  专栏  ›  技术社区  ›  Landon Kuhn

这是什么?[ljava.lang.object;?

  •  97
  • Landon Kuhn  · 技术社区  · 14 年前

    我打电话时收到这个 toString 在从函数调用接收到的对象上。我知道对象的类型是用这个字符串编码的,但我不知道如何读取它。

    这种编码叫什么?

    1 回复  |  直到 5 年前
        1
  •  194
  •   rogerdpack    6 年前

    [Ljava.lang.Object; 的名字是 Object[].class , the java.lang.Class 表示数组的类 Object .

    命名方案记录在 Class.getName() :

    如果此类对象表示不是数组类型的引用类型,则返回该类的二进制名,如Java语言规范所指定的那样。 §13.1 )

    如果该类对象表示基元类型或 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 继承自的方法 对象 ,具体如下:

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

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

    注释 :您不能依赖 托斯特林() 任何符合上述规范的任意对象,因为它们可以(并且通常可以) @重写 它是为了归还其他东西。检查任意对象类型的更可靠方法是调用 getClass() 关于它(A) final 方法继承自 对象 然后 reflecting 归还 Class 对象。不过,理想情况下,API的设计应该使反射不必要(请参见 有效Java第二版,项目53:喜欢界面反射 )


    关于一个更“有用的” 弦线 对于数组

    java.util.Arrays 提供 弦线 基元数组和的重载 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 通过它们的元素以及许多与数组相关的实用方法执行数组相等比较的方法。

    相关问题