Java中println(charArray + String)与println(charArray)的区别

5

I have

char c1 = 'S';           // S as a character
char c2 = '\u0068';      // h in Unicode
char c3 = 0x0065;        // e in hexadecimal
char c4 = 0154;          // l in octal
char c5 = (char) 131170; // b, casted (131170-131072=121)
char c6 = (char) 131193; // y, casted (131193-131072=121)
char c7 = '\'';          // ' apostrophe special character
char c8 = 's';           // s as a character
char[] autoDesignerArray = {c1, c2, c3, c4, c5, c6, c7, c8};

And

System.out.println(autoDesignerArray + "Mustang"); 

输出结果:[C@c17164Mustang
System.out.println(autoDesignerArray);

输出: Shelby's

我不明白为什么在将字符数组与字符串连接时会得到奇怪的输出。"[C@c17164"是什么?它是内存中的位置吗?为什么在与字符串连接时我会得到这个东西,但当我单独打印时却得到我预期的结果?


System.out.println(autoDesignerArray + "Mustang");System.out.println(autoDesignerArray);不是同一个方法。System.out.println提供了一个重载方法来处理char数组。 - ortis
4个回答

7
表达式 System.out.println(X + Y) 等价于表达式 System.out.println(X.toString() + Y.toString())
当你调用 System.out.println(autoDesignerArray + "Mustang") 时,autoDesignerArray.toString()(即 "[C@c17164")会与 "Mustang" 连接起来并输出。

啊,这很有道理。 - Mike P
根据您的第二点,当您调用System.out.println(autoDesignerArray) autoDesignerArray.toString()(即“[C@c17164”)应该被打印出来,但它却打印了Shelby的。如果我们不使用字符串连接打印数组,则会打印实际数据,但如果我们将数组与字符串连接,则会打印哈希码地址。 - Vikas
根据您的第二点,当您调用System.out.println(autoDesignerArray)时,将打印autoDesignerArray.toString()(即“[C@ c17164”),但实际上不是这样的,在println(autoDesignerArray)中没有使用toString()函数,它只是从数组中简单地打印每个字符。这是可能的,因为在PrintStream(System.out的一个实例)中存在一些重载的println方法之一是println(char[])。 - Pshemo

2

由于每个数组都有一个类,所以你得到的字符串是其对象的对象表示形式,例如[C@c17164Mustang,其中

  • [C是类名([代表1D数组)
  • @连接字符串
  • c17164一些哈希码
  • Mustang你的字符串

要检查数组的类名,请执行System.out.println(yourArray.getClass().getName());

例如,如果您执行System.out.println(new Object());,您将得到类似于java.lang.Object@25154f的对象创建的字符串表示形式。

要打印数组的实际值,请执行System.out.println((java.util.Arrays.toString(autoDesignerArray)));,它会返回

[S, h, e, l, b, y, ', s]

Demo


感谢您解释问题的另一部分。 - Mike P

0

Java中的数组没有重写toString()方法,这意味着:

  1. System.out.println(autoDesignerArray + "Mustang");
    • 将打印数组的默认toString()并将其与字符串连接
    • toString()的默认实现将打印二进制名称,后跟hashCode()(char数组将打印[C后跟其哈希码)
  2. System.out.println(autoDesignerArray);
    • 实际上会调用Arrays.toString()或类似的功能来正确处理数组的toString()

1
我非常确定第二点是由于这个引起的。对于第一个点也不确定。 - npinti

0
这与数组有关,以及它们为什么不会隐式继承Object - 欲了解更多信息,请查看此SO问题(已有答案)。
Oracle Doc中,println(char[] s) 有点让我困惑 - 在C中,您通常会迭代数组中的每个元素,并打印每个元素,然后跟随一个\n来换行。
然而,总体来说,autoDesignerArray.toString()不会像您希望的那样工作(这就是为什么它返回[C@c17164)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接