如果一个字符数组在Java中是一个对象,为什么打印它不显示它的哈希码?

22

打印字符数组不会显示哈希码:

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

为什么整数数组被打印为哈希码而不是字符数组?


2
相关:https://dev59.com/zGAf5IYBdhLWcg3wSQ4z - Pshemo
1
另一个例子来说明先前的答案:System.out.println((Object)charArray); - SJuan76
6个回答

24

首先,char数组在Java中就像任何其他类型的数组一样是对象。只是打印方式不同。

PrintStream(这是System.out实例的类型)有一个特殊的println版本用于字符数组-public void println(char x[]),因此它不必针对该数组调用toString方法。它最终调用public void write(char cbuf[], int off, int len),将数组的字符写入输出流。

这就是为什么调用println时,char[]的行为与调用其他类型数组时不同的原因。对于其他数组类型,会选择public void println(Object x)重载,该重载调用String.valueOf(x),然后调用x.toString(),返回诸如[I@19e0bfd的内容。


System.out是PrintStream(我希望它是PrintWriter,但由于与旧版本的一致性,此类型未更改为writer)。 - Pshemo

4
int数组是由整数组成的数组,而char数组则由可打印字符组成。PrintWriter有能力打印字符数组,因为这就是它打印字符串的方式。因此,PrintWriter会像打印字符串一样打印它们,而不调用toString()方法将其转换为字符串。将int数组转换为字符串会返回一个哈希码,这解释了为什么会出现那种输出结果。
例如:
int[] ints = new int[] { 1, 2, 3 };
char[] chars = new char[] { '1', '2', '3' }

如果您使用您所用的方法打印这两个序列,它将打印整数数组的哈希码,后跟“123”。

3

System.out是PrintStream,它具有一个特殊的方法用于char[]参数

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

2
这个答案不完整。print(x) 方法是做什么的? - Arturo Torres Sánchez

1
当然,在Java中,不管数组是什么类型,它都是一个对象。
至于您的问题,java.io.PrintStream类中有一个名为println(char[] array)的方法,它打印来自char数组的所有字符。这就是当您将char[]作为参数传递给println()时,它不会调用java.util.Array类的toString()方法的原因,而是遍历数组并打印每个字符。

引用:

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println(char[])


1

System.out实际上会给你一个PrintStream对象。它的println(params)有一些不同的重载方法,这些方法针对不同类型的params进行了不同的实现。

如果这个params是一个char[],则输出将作为char[]元素提供,例如System.out.println(charArray);输出abc而不是像int[]那样输出哈希码,例如System.out.println(intArray);输出[I@19e0bfd

PS:在Java中,所有的array都被视为Object

请参见官方文档

此外,对于打印array,应始终使用Arrays实用程序类。最好使用其方法Arrays.toString()来打印array对象。


1
其他答案已经正确解释了您调用PrintStream.println的情况,对于.print也是如此。然而,您的标题可能涵盖其他打印方式PrintWriter.println.print以及.write确实具有char[]重载来进行简单的调用。
然而,格式化没有特殊情况:
 System.out.format ("%s%n", charArray); // or printf
 myPrintWriter.format ("%s%n", charArray); // or printf

每个输出都会生成一个类似于处理 int 和其他类型数组的 [C@hash。请注意保留 HTML 标签。

拼接操作也不适用于常用的打印操作:

 System.out.println ("the value of charArray is " + charArray);

输出 charArray 的值为 [C@hash。


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