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

时间:2015-04-23 06:24:25

标签: 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);
        Integer[] b={10,20,30};
        System.out.println(b);
        }
}

这是输出

abcaa
[I@239d5fe6
[Ljava.lang.Integer;@5527f4f9

我知道它必须处理toString()方法。它已在char中重写以返回值。因此我们按预期获得了第一个输出 这是toString() ..

的重写java.lang.Character方法
public String toString() {
      char buf[] = {value};//The value of the Character.
      return String.valueOf(buf);
   }

但是看看Integer还有被覆盖的toString()方法

public String toString() {
        return String.valueOf(value); //The value of the Integer.
     }

那么为什么打印a1和b代码会调用Object类的默认toString()实现,即:

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

此外,由于valueOf创建了另一个Object,但它在两个重写的方法中都很常见。

6 个答案:

答案 0 :(得分:7)

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

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

  

public void println(char[] x)

     

打印一个字符数组,然后终止该行。这种方法   表现得好像它会调用print(char[])然后调用println()

     

<强>参数
  x - 要打印的一系列字符。

实施:

public void println(char x[]) {
    synchronized (this) {
      print(x);
      newLine();
   }
}

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

答案 1 :(得分:1)

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

哪个循环包含char[]

的所有元素

当您调用println whith int[]Integer[]时,由于没有方法在签名中包含这些数组,因此使用了Object

 public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

答案 2 :(得分:0)

这是因为当你打电话时:

 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]);

它会打印出预期的输出。

答案 3 :(得分:0)

printStream有一个特定的方法来打印char [],但没有打印int []或其他一些数组的方法,所以当处理不是fo类型char []的数组时,你正在调用方法with Object as参数whic委托给toString()方法,该方法不迭代单个元素。

如果您想要始终打印数组的内容,则有一个标准的api

  

的System.out.println(Arrays.toString(阵列));

答案 4 :(得分:0)

因为您要将这些对象转换为字符串。您应该使用java.util.Arrays的toString()方法 喜欢: &#34; Arrays.toString(A1); Arrays.toString(B)&#34;

答案 5 :(得分:-2)

因为你没有调用int的toString或Integer的toString,所以你正在调用Integer [] toString。这将创建存储在Array中的对象的文本表示,而不是存储的各个对象的的文本表示。