【问题标题】:Java println(charArray + String) vs println(charArray)Java println(char Array + String) vs println(char Array)
【发布时间】:2015-06-07 12:48:10
【问题描述】:

我有

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};

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

输出:[C@c17164Mustang

System.out.println(autoDesignerArray);

输出:谢尔比的

我不明白为什么当我将 char 数组与字符串连接时会得到奇怪的输出。什么是“[C@c17164”?记忆中的位置?为什么当我与一个字符串连接时会得到它,但是当我单独打印它时却得到了我所期望的?

【问题讨论】:

  • System.out.println(autoDesignerArray + "Mustang");System.out.println(autoDesignerArray); 不是同一种方法。 System.out.println 提供处理 char 数组的重载

标签: java arrays string char concatenation


【解决方案1】:

java中的数组没有覆盖toString()方法,也就是说:

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

【讨论】:

  • 我很确定第二点是由于this。也不确定第一个。
【解决方案2】:

表达式System.out.println(X + Y) 等于表达式 System.out.println(X.toString() + Y.toString()).

当您调用System.out.println(autoDesignerArray + "Mustang") 时,autoDesignerArray.toString()(即"[C@c17164")与"Mustang" 连接并打印结果。

【讨论】:

  • 啊,有道理。
  • 根据您的第二点,当您调用 System.out.println(autoDesignerArray) 时,应该打印 autoDesignerArray.toString() (即“[C@c17164”),但它会打印谢尔比的。没有字符串与数组连接会打印实际数据,但如果我们将数组与字符串连接,则它会打印哈希码地址。
  • @VikasKumarSingh "根据您的第二点,当您调用 System.out.println(autoDesignerArray) autoDesignerArray.toString() (即“[C@c17164”)时应该打印 i>" 不完全是,autoDesignerArray.toString() 返回字符串"[C@c17164",但println(autoDesignerArray) 不涉及toString(),它只是打印数组中的每个字符。这是可能的,因为在PrintStreamSystem.out 是其实例)中存在一些重载的println 方法,其中之一是println(char[])
【解决方案3】:

这与数组有关,以及为什么它们不会隐式继承 Object - 欲了解更多信息,请随时查看此SO question(在那里有答案)。

println(char[] s)Oracle Doc 中确实让我有些困惑 - 在 C 中,您通常会遍历数组中的每个元素,print 每个元素后跟 \n 以打破界限。

然而,最重要的是autoDesignerArray.toString() 不会像你希望的那样工作(这就是它返回[C@c17164 的原因)。

【讨论】:

    【解决方案4】:

    由于每个数组都有一个类,因此您得到的字符串是其对象的对象表示,即[C@c17164Mustang where

    • [C 是类名([ 代表一维数组)
    • @ 连接字符串
    • 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

    【讨论】:

    • 感谢您解释问题的另一部分。
    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2012-06-09
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多