Java println(charArray + String) 与 println(charArray)
Java println(charArray + String) vs println(charArray)
我有
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”?内存中的位置?为什么当我连接一个字符串时得到它,但当我单独打印它时却得到我期望的结果?
java中的数组没有覆盖toString()
方法,这意味着:
System.out.println(autoDesignerArray + "Mustang");
- 将打印数组的默认值
toString()
并将其与字符串 连接起来
toString()
的默认实现将打印二进制名称后跟 hashCode()
(字符数组将打印 [C 后跟它的哈希码)
System.out.println(autoDesignerArray);
- 实际上会调用 Arrays.toString() 或类似的功能来正确处理数组的
toString()
表达式System.out.println(X + Y)
等于表达式
System.out.println(X.toString() + Y.toString())
.
当您调用 System.out.println(autoDesignerArray + "Mustang")
时,autoDesignerArray.toString()
(即 "[C@c17164"
)与 "Mustang"
连接并打印结果。
这与数组有关,以及为什么它们不隐式继承 Object
- 如需更多信息,请随时查看此 SO question(那里有答案)。
println(char[] s)
在 Oracle Doc 中确实让我有些困惑 - 在 C 中,您通常会遍历数组中的每个元素,print
每个元素后跟一个 \n
打破这条线。
然而,最重要的是 autoDesignerArray.toString()
不会像您希望的那样真正发挥作用(这就是 returns [C@c17164
的原因)。
因为每个 has 数组都有一个 class 你得到的字符串是它的对象的对象表示,即 [C@c17164Mustang
where
[C
是一个class名称([
表示一维数组)
@
连接字符串
c17164
一些哈希码
Mustang
你的字符串
检查数组的 class 名称做 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]
我有
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”?内存中的位置?为什么当我连接一个字符串时得到它,但当我单独打印它时却得到我期望的结果?
java中的数组没有覆盖toString()
方法,这意味着:
System.out.println(autoDesignerArray + "Mustang");
- 将打印数组的默认值
toString()
并将其与字符串 连接起来
toString()
的默认实现将打印二进制名称后跟hashCode()
(字符数组将打印 [C 后跟它的哈希码)
- 将打印数组的默认值
System.out.println(autoDesignerArray);
- 实际上会调用 Arrays.toString() 或类似的功能来正确处理数组的
toString()
- 实际上会调用 Arrays.toString() 或类似的功能来正确处理数组的
表达式System.out.println(X + Y)
等于表达式
System.out.println(X.toString() + Y.toString())
.
当您调用 System.out.println(autoDesignerArray + "Mustang")
时,autoDesignerArray.toString()
(即 "[C@c17164"
)与 "Mustang"
连接并打印结果。
这与数组有关,以及为什么它们不隐式继承 Object
- 如需更多信息,请随时查看此 SO question(那里有答案)。
println(char[] s)
在 Oracle Doc 中确实让我有些困惑 - 在 C 中,您通常会遍历数组中的每个元素,print
每个元素后跟一个 \n
打破这条线。
然而,最重要的是 autoDesignerArray.toString()
不会像您希望的那样真正发挥作用(这就是 returns [C@c17164
的原因)。
因为每个 has 数组都有一个 class 你得到的字符串是它的对象的对象表示,即 [C@c17164Mustang
where
[C
是一个class名称([
表示一维数组)@
连接字符串c17164
一些哈希码Mustang
你的字符串
检查数组的 class 名称做 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]