toString()方法簡單分析
阿新 • • 發佈:2019-01-11
問題描述
今天在使用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方法。
謝謝,歡迎指正!