【问题标题】:Java char[] toStringJava char[] toString
【发布时间】:2013-09-08 15:06:15
【问题描述】:

我正在使用 Java 中的char[] 玩arround,并使用以下示例代码:

char[] str = "Hello World !".toCharArray();
System.out.println(str.toString());
System.out.println(str);

我得到以下输出:

[C@4367e003
Hello World !

我对此有一些疑问:

  1. [C@4367e003 代表什么?是内存地址吗?数字的含义是什么? [C@是什么意思?

  2. 我一直以为在一个对象上调用println()会调用这个对象的toString方法,但好像不是这样?

谢谢!!

【问题讨论】:

  • 新字符串(字符数组);从 char 数组创建一个字符串,是的,那是一个内存地址,我认为 C 显示它的一个 char 数组,而 at 字面意思是该地址是内存中保存数组的位置。
  • 由于数组是类,它们是从Object扩展而来的,并且不会覆盖toString方法,所以它们将使用Object#toString(阅读链接以了解System.out.println(array)中的结果)。
  • @tieTYT 不是重复的。这个问题是为什么System.out.println(str); 打印数组中的值,而不是str.toString(); 的值。

标签: java char tostring


【解决方案1】:
  1. [C表示是字符数组([表示数组;C表示char),@4367e003表示在内存地址[1]4367e003。如果您想要一个表示该字符数组的字符串,请尝试new String(str)

  2. println is overloaded;还有一个接受字符数组的println。如果您不传递原语Stringchar[],它将在对象上调用toString,因为System.out.println(Object) 有一个单独的重载。 Here is the documentation for the specific method that takes a character array.

    这里是 println 的重载(直接来自文档):

    void println()
    void println(boolean x)
    void println(char x)
    void println(char[] x)
    void println(double x)
    void println(float x)
    void println(int x)
    void println(long x)
    void println(Object x)
    void println(String x)
    

    您可以在this tutorial 底部阅读更多关于重载的信息。


[1]:从技术上讲,它实际上是对象哈希码的十六进制表示,但这通常是通过使用内存地址来实现的。请注意,它并不总是真正的内存地址。有时这不适合int。更多信息in this quesiton

【讨论】:

  • 认为默认 toString 表示中的数字是地址是一个典型的错误。其实就是对象哈希码的十六进制表示。
【解决方案2】:

它正在对象上调用toString()。该对象是一个不会覆盖toString() method coming from Object 的数组。对象的实现:

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

[C 表示 char (C) 的数组 ([)。 Javadocs for Class#getName()解释得更详细。

4367e003object's hash code,很可能是内存地址。

在合理可行的情况下,hashCode 方法定义为 类 Object 确实为不同的对象返回不同的整数。 (这 通常是通过转换的内部地址来实现 对象转换成整数,但这种实现技术不是 JavaTM 编程语言所要求的。)

当您不调用toString() 时,您实际上是在调用println method that takes a char[],它知道如何打印出字符。

【讨论】:

    【解决方案3】:

    [C@4367e003 代表什么?是内存地址吗?数字的含义是什么? [C@ 是什么意思?

    这是一个字符数组的Object#toString 表示

    • [ 表示一个数组
    • C 是一个编码字符,表示原始字符数组(找到的所有编码here

    • 4367e003 是字符数组对象哈希码的十六进制表示

    我一直以为在一个对象上调用 println() 会调用这个对象的 toString 方法,但好像不是这样的?

    它确实调用了toString,但由于原始字符数组str 没有覆盖toString,它调用Object#toString 要查看数组的内容,您可以使用new String(str) 将数组包装在一个新的String 中.

    【讨论】:

      【解决方案4】:

      它是以字符串形式打印出来的对数组的引用。你想要的是Arrays.toString(str)。并且不要忘记导入 Arrays 类。

      【讨论】:

        【解决方案5】:

        第一个 println() 打印出字符数组的 toString() 方法。 toString() 的默认实现是打印一个[,一个用于char 的C@ 符号,然后是数组的哈希码,默认情况下是数组的内存地址。

        【讨论】:

          猜你喜欢
          • 2014-01-19
          • 2014-07-14
          • 1970-01-01
          • 2018-08-01
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多