1. 程式人生 > >java中為什麼列印char陣列輸出是值,而其他是地址值

java中為什麼列印char陣列輸出是值,而其他是地址值

首先println方法對陣列的處理是先轉化為String型別,我們可以進入println原始碼看一下,我是建立了一個String陣列進去看了下
    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

首先他都轉化成了String,然後進入print方法

    public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
    }
接下來我們再進入write方法
    private void write(String s) {
        try {
            synchronized (this) {
                ensureOpen();//確認輸出流是否打開了
                textOut.write(s);//就是一個bufferWriter,寫入到緩衝區
                textOut.flushBuffer();//重新整理快取區
                charOut.flushBuffer();//OutputStreamWriter
                if (autoFlush && (s.indexOf('\n') >= 0))
                    out.flush();//這裡就是與char陣列的卻別,他直接把String s重新整理到了控制檯的輸出流中,但是記住他沒有和toString方法相關聯
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }
那我們看看char陣列的write方法
    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;
        }
    }


其實這是第二次遇到這問題了,但是之前沒有非常明白,這裡弄清楚記錄一下,也供大家參考一下