如果 char 数组是 Java 中的 Object,为啥打印它不显示其哈希码?
Posted
技术标签:
【中文标题】如果 char 数组是 Java 中的 Object,为啥打印它不显示其哈希码?【英文标题】:If a char array is an Object in Java, why does printing it not display its hash code?如果 char 数组是 Java 中的 Object,为什么打印它不显示其哈希码? 【发布时间】:2015-09-21 23:39:08 【问题描述】:打印 char 数组不显示哈希码:
class IntChararrayTest
public static void main(String[] args)
int intArray[] = 0,1,2;
char charArray[] = 'a','b','c';
System.out.println(intArray);
System.out.println(charArray);
输出:
[I@19e0bfd
abc
为什么打印的是整数数组而不是字符数组?
【问题讨论】:
相关:***.com/questions/24833562/… 另一个说明前面答案的例子:System.out.println((Object)charArray);
【参考方案1】:
其他答案正确解释了您单独调用PrintStream.println
的情况,.print
也是如此。但是,您的标题可以涵盖其他打印方式。 PrintWriter.println
和 .print
AND .write
对于简单的调用确实有 char[]
重载。
但是,格式化没有特殊情况:
System.out.format ("%s%n", charArray); // or printf
myPrintWriter.format ("%s%n", charArray); // or printf
每个输出[C@hash
,类似于int
和其他类型数组的处理。
连接也不行,常用于打印:
System.out.println ("the value of charArray is " + charArray);
输出the value of charArray is [C@hash
。
【讨论】:
【参考方案2】:首先,char 数组是 Java 中的 Object,就像任何其他类型的数组一样。只是打印方式不同。
PrintStream
(这是System.out
实例的类型)对于字符数组有一个特殊版本的println
- public void println(char x[])
- 所以它不必为该数组调用toString
。它最终调用public void write(char cbuf[], int off, int len)
,将数组的字符写入输出流。
这就是为什么为 char[]
调用 println 的行为与为其他类型的数组调用它的行为不同。对于其他数组类型,选择public void println(Object x)
重载,它调用String.valueOf(x)
,它调用x.toString()
,它为int 数组返回类似[I@19e0bfd
的东西。
【讨论】:
System.out
是 PrintStream
(我希望它是 PrintWriter,但由于与旧版本的一致性,这种类型没有更改为 writer)。【参考方案3】:
System.out 是 PrintStream,它有一个特殊的 char[] arg 方法
public void println(char x[])
synchronized (this)
print(x);
newLine();
int[] 是通过这个方法打印出来的
public void println(Object x)
String s = String.valueOf(x);
synchronized (this)
print(s);
newLine();
【讨论】:
这个答案不完整。print(x)
方法有什么作用?【参考方案4】:
System.out
实际上给你一个PrintStream
的对象。并且它的println(params)
有一些重载方法,这些方法针对不同类型的params
实现不同。
如果params
是char[]
,则此params
提供char[]
元素的输出,如System.out.println(charArray);
输出abc
,但不是int[]
的哈希码,如System.out.println(intArray);
输出[I@19e0bfd
。
PS :- 所有array
在Java 中都被视为Object
。
见Official Doc
此外,要打印array
,请始终使用Arrays
实用程序类。其方法Arrays.toString()
最好用于打印array
对象。
【讨论】:
【参考方案5】:int 数组是整数数组,其中 可打印 字符的 char 数组。 printwriter 具有打印字符数组的能力,因为这就是它打印字符串的方式。因此,printwriter 会像字符串一样打印它们,而无需调用 toString() 方法将其转换为字符串。将 int 数组转换为字符串会返回一个哈希码,解释为什么会得到该输出。
以此为例:
int[] ints = new int[] 1, 2, 3 ;
char[] chars = new char[] '1', '2', '3'
如果您要使用您使用的方法打印这两个序列,它将打印 int 数组的哈希码,后跟“123”。
【讨论】:
【参考方案6】:当然数组是 Java 中的对象。不管它是什么类型的数组。它始终是 Java 中的对象。
但就您的问题而言,java.io.PrintStream
类中有一个方法println(char[] array)
可以打印出char array
中的所有字符。这就是原因,当您将char[]
作为参数传递给println()
时,它不会调用java.util.Array
类的toString()
方法,而是循环遍历数组并打印每个字符。
引用:
http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println(char[])
【讨论】:
以上是关于如果 char 数组是 Java 中的 Object,为啥打印它不显示其哈希码?的主要内容,如果未能解决你的问题,请参考以下文章
Java新人,关于String类中,private final char value[],到底是数组本身不可变还是数组中的值不可变
java中一个字符的String类型如何转换成char类型?