在java中,为什么打印Integer数组对象会给出哈希代码,而char数组对象会给出值?

在java中,为什么打印Integer数组对象会给出哈希代码,而char数组对象会给出值?,java,arrays,Java,Arrays,下面是代码片段 public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub char[] a={'a','b','c',97,'a'}; System.out.println(a); int[] a1={8,6,7}; System.out.println(a1);

下面是代码片段

public class Test1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        char[] a={'a','b','c',97,'a'};
        System.out.println(a);
        int[] a1={8,6,7};
        System.out.println(a1);
        Integer[] b={10,20,30};
        System.out.println(b);
        }
}
这是输出

abcaa
[I@239d5fe6
[Ljava.lang.Integer;@5527f4f9
我知道它必须处理
toString()
方法。已在char中重写它以返回值。因此,我们得到了预期的第一个输出 下面是
java.lang.Character
的重写
toString()
方法

public String toString() {
      char buf[] = {value};//The value of the Character.
      return String.valueOf(buf);
   }
但是看整数,还有被重写的
toString()
方法

public String toString() {
        return String.valueOf(value); //The value of the Integer.
     }
那么为什么打印a1和b代码会调用对象类的默认
toString()
实现,即:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

另外,由于valueOf生成另一个对象,但这在两种重写方法中都很常见。

因为有一种用于打印字符数组的专用方法:

public void println(char[]x)

打印一个字符数组,然后终止该行。这种方法 其行为就像调用
print(char[])
然后调用
println()

参数
x
-要打印的字符数组

实施:


它与
toString
实现
char[]
类无关。

这是因为调用时:

 int[] a1={8,6,7};
 System.out.println(a1);
您正在调用
Integer[].toSTring()
而不是
Integer.toSTring()

您需要在元素上的每个元素上循环,或者重写
Integer[].toSTring()
以在其每个元素上调用
toSTring()

如果你写下:

 System.out.println(a1[0]);
 System.out.println(a1[1]);
 System.out.println(a1[2]);
它将打印您期望的输出。

有一个打印char[]的特定方法,但没有打印int[]或其他一些数组的方法,因此在处理非fo-type char[]的数组时,您将调用对象作为参数的方法,该方法将委托给
toString()
不在单个元素上迭代的方法

如果希望始终打印阵列的内容,则有一个标准api

System.out.println(array.toString(array))


因为您没有调用int的toString或Integer的toString,所以您调用的是Integer[]toString。这将创建存储在数组中的对象的文本表示,而不是存储的单个对象的值的文本表示

这是因为在
java.io.PrintSream
类中,您有一个
char[]

/**
 * Prints an array of characters and then terminate the line.  This method
 * behaves as though it invokes <code>{@link #print(char[])}</code> and
 * then <code>{@link #println()}</code>.
 *
 * @param x  an array of chars to print.
 */
public void println(char x[]) {
    synchronized (this) {
        print(x);
        newLine();
    }
}
最后调用一个内部方法

private void write(char buf[]) {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.write(buf);
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush) {
                    for (int i = 0; i < buf.length; i++)
                        if (buf[i] == '\n')
                            out.flush();
                }
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }

因为您正在将这些对象转换为字符串。您应该使用java.util.array的toString()方法 比如: “阵列.toString(a1);
toString(b)”。

尝试实际添加您正在谈论的文本部分,而不是仅仅让链接在打印时,它被传递到
println(Object o)
方法的对象参数中,因此调用默认对象
toString()
方法,从而将hashCode作为输出。而如果我写
整数a=新的整数(10)
和print a,它被传递到
println(Object o)
的对象参数中,但由于Integer已重写
toString()
方法,因此它将10作为输出,而不是哈希代码。正确的?如果我误解了这一点,请告诉我,为什么
char[]
打印正确,这个答案没有解释。因为上面已经给出了答案。再加一个是多余的。嗯,下层选民的想法不同。也许他们会在你的评论后恢复投票。这个答案没有解释为什么
char[]
打印正确。@Tom你是对的,我编辑了我的回答。可能下层选民现在会恢复投票。你为什么要添加两个答案。您已经回答了,您可以编辑此答案。@Loki要跟踪我的错误答案是否有名为
Integer[]的内容。toSTring()
?我在任何地方都没有看到过~它没有定义,这就是为什么你会得到默认行为@AnkurAnandi理解这一点。在我对公认答案的评论中也指出了这一点。如果我在那里的任何地方错了,就告诉我@不,我想你明白了。恭喜你!
private void write(char buf[]) {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.write(buf);
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush) {
                    for (int i = 0; i < buf.length; i++)
                        if (buf[i] == '\n')
                            out.flush();
                }
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }
 public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }