2015-01-15 236 views
-2

這裏是我的代碼:打印字符串數組

String[] magic = {"stick", "hat", "witch"}; 
String magic1 = magic.toString(); 
String magic2 = Arrays.toString(magic); 

System.out.println(magic1);   // this is printing a memory location 
System.out.println(magic2);   // this one prints: [stick, hat, witch] 

是什麼magic1magic2之間的區別?

+1

'magic1'是數組的默認toString()輸出。 'magic2'是Arrays類中toString()方法的輸出,它可以獲取所有元素。 – csmckelvey

+0

首先打印出陣列魔法的身份散列碼。可能看起來像'String @ 548543fdfds'。 –

+0

除了他不問如何打印數組。 –

回答

0

它基本上是一個量身定做的toString它使輸出漂亮。

你在中看到的第一個toString是內存地址。原因是變量名稱就是這樣 - 一個內存地址(又名引用)。

每個類都繼承toString,並且可以實現它自己的。

See Arrays class API

String[] names = {"Bob", "Dad", "Mom"}; 
String names1 = names.toString(); 
String names2 = Arrays.toString(names); 

System.out.println(names1);   
System.out.println(names2);   

打印出:

[Ljava.lang.String;@1034bb5 
[Bob, Dad, Mom] 
+1

感謝您的回覆。我的問題是不應該是他們兩個輸出相同?爲什麼magic2不打印參考呢? –

+0

@kalpakhan - :) – Coffee

0

閱讀doumentation。我在這裏複製了必要的信息。

public static String toString(Object[] a) 

返回指定陣列內容的字符串表示。如果數組包含其他數組作爲元素,則它們將通過從Object繼承的Object.toString()方法轉換爲字符串,該方法描述其身份而不是其內容。

該方法返回的值等於Arrays.asList(a).toString()返回的值,除非a爲null,在這種情況下返回「null」。

public String toString() 

返回對象字符串表示。通常,toString方法返回一個「文本表示」該對象的字符串。結果應該是一個簡潔但內容豐富的表述,對於一個人來說很容易閱讀。建議所有子類重寫此方法。 類Object的toString方法返回一個字符串,其中包含對象爲實例的類的名稱,符號字符「@」和對象的哈希代碼的無符號十六進制表示形式。換句話說,此方法返回一個字符串等於的值:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 
1

數組是對象,但它們不會改變(重寫)其toString()方法,這意味着它們使用默認的,從Object繼承。如果你讀documentation of this method,你會發現:

Object類的toString方法返回一個包含其中的對象是一個實例,則在符號字符'@」之類的名稱的字符串,無符號對象的哈希碼的十六進制表示。換句話說,此方法返回一個字符串等於的值:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

在你的情況

  • getClass().getName()返回[Ljava.lang.String這意味着
    • 一門維陣列(因爲只有一個[
    • 類型全名是java.lang.String
  • and Integer.toHexString(hashCode())返回類似於1db9742的東西,它是由hashCode()方法返回的十六進制形式的整數。

現在,如果你看一看的Arrays.toString(Object[] array)代碼(String[]被視爲Object[]

4531 publicstaticString toString(Object [] a) {
4532 if (a == null)
4533 return "null";
4535 int iMax = a.length - 1;
4536 if (iMax == -1)
4537 return "[]";
4539 StringBuilder b = newStringBuilder();
4540 b. append ('[');
4541 for (int i = 0; ; i++) {
4542 b. append (String. valueOf (a[i]));
4543 if (i == iMax)
4544 return b. append (']'). toString();
4545 b. append (", ");
4546 }
4547 }

你會看到,它的目的是創建從字符串數組的內容建設。它通過遍歷所有元素並將它們的字符串表示形式添加到StringBuilder來完成此操作,該構造函數隨後將用於創建將返回的String。