如果 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.outPrintStream(我希望它是 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 实现不同。

如果paramschar[],则此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中如何将一个字符串赋给一个数组

Java中char数组的默认值是啥?

java中一个字符的String类型如何转换成char类型?

Java Array Char和String在数组中的区别[重复]

Java Arrays 排序