1. 程式人生 > >toString()方法簡單分析

toString()方法簡單分析

問題描述

今天在使用spotbugs程式碼走查時發現這樣一個問題,如下,

String[] myArray=new String[] {"1","2","3"};
System.out.println(myArray.toString());

一看看上去這個程式碼沒什麼問題,列印了陣列的值,關鍵是打印出的結果是什麼?結果如下

[Ljava.lang.String;@7852e922

那麼問題來了,打印出上面一行東西,這是什麼,初衷是要列印陣列中的值,起碼也是能看懂的呀

暴露的問題

上面的程式碼,暴露了下面的問題,

1、對toString()方法的不瞭解;

2、如何打印出能識別的結果;

問題剖析

首先,看下toString()方法,此方法為Object類中定義的方法,一切繼承Object類的方法都可以重寫toString()方法,下面是Object類中toString()方法的定義,

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

此方法返回值是類的許可權類名[email protected]+hashcode碼,參照上面的列印的結果,我們可以知道陣列類沒有重寫toString()方法

,那麼要怎麼優雅列印陣列中的資訊那?

通過檢視Arrays類,我們發現Arrays類中雖然沒有重新toString()類,但有幾個過載的toString方法,例如,toString(boolean[] a)、toString(long[] a)、toString(Object[] a),下面是其中一個方法的原始碼,

public static String toString(Object[] a) {
        if (a == null)
            return "null";

        int iMax = a.length - 1;
        
if (iMax == -1) return "[]"; StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0; ; i++) { b.append(String.valueOf(a[i])); if (i == iMax) return b.append(']').toString(); b.append(", "); } }

通過分析,原始碼可以看出是以[]括起來,然後依次列印陣列中的元素,那麼在列印陣列中元素的時候就可以使用Arrays.toString(Object[] a)方法,列印結果如下,

[1, 2, 3]

上面的結果是我們希望見到的,也是我們能理解的,只有這樣的才是有意義的。

最後,所有的類均繼承自Object類,如果不重新toString方法,列印的結果就是類的全限類名[email protected]+hashcode,如果想要列印想要的資訊,請務必重新toString方法。

 

謝謝,歡迎指正!