2012-12-08 17 views
10
String[] array = {"a","c","b"}; 
    ArrayList<String> list = new ArrayList<String>(); 
    list.add("a"); 
    list.add("b"); 
    list.add("c"); 
    System.out.println(array); 
    System.out.println(list); 

對於list[a, b, c]輸出而array一些地址輸出。當我們想要輸出array的值時,我們可以使用Arrays.toString(array);,它的工作方式與list一樣。爲什麼toString()方法的工作方式不同數組和ArrayList對象之間的Java

我只是想知道爲什麼我們不能直接撥打toString()array來獲取值。這樣做更直觀,更方便嗎?在ArrayArrayList的不同處理中有什麼結果?

回答

11

數組和ArrayList的主要區別在於ArrayList是一個用Java編寫的類,它有自己的實現(包括決定覆蓋toString),而數組是語言規範本身的一部分。特別地,JLS 10.7狀態:

數組類型的成員是以下所有:

  • 公共最終字段長度
  • 公共方法克隆,它覆蓋的方法在Object類中有相同的名稱,並且不引發檢查的異常。
  • 所有從類Object繼承的成員;沒有繼承的對象的唯一方法是它的克隆方法。

換句話說語言規範防止要被重寫的陣列的方法toString,因此它使用在Object定義的默認的實現它打印類名和哈希碼。

爲什麼這個決定已經作出的是,也許應該問語言的設計者問題...

+0

另請參閱[這個答案](http://stackoverflow.com/a/10295995/829571)。 – assylias

4

我只是想知道爲什麼我們不能直接調用toString()來獲取 的值。

實際上toString方法在數組對象上被調用。但是,由於數組類型不會覆蓋Object類中的toString方法,因此將調用toString的默認實現,該方法返回您看到的表單的表示形式。

中的表示形式爲: -

[[email protected] 

在你的情況下,它是這樣的: -

[Ljava.lang.String;@3e25a5 

然而,在ArrayList實例的情況下,在ArrayList類中重寫toString方法調用。

0

因爲當你默認打印[email protected]打印toString(),會的。

因此,當您打印array時,則會打印上面的內容。

但是ArrayListAbstractCollection類推廣的,並且其中toString()方法重寫如下

public String toString() { 
     Iterator<E> it = iterator(); 
     if (! it.hasNext()) 
      return "[]"; 

     StringBuilder sb = new StringBuilder(); 
     sb.append('['); 
     for (;;) { 
      E e = it.next(); 
      sb.append(e == this ? "(this Collection)" : e); 
      if (! it.hasNext()) 
       return sb.append(']').toString(); 
      sb.append(',').append(' '); 
     } 
    } 

打印出ArrayList對象的可讀的格式。

-1

對於arraytoString()方法它打印內存地址。但在ArrayList這個類覆蓋ObjecttoString()方法。

toString()實現的ArrayList的

0

這是toString方法調用用於ArrayList的。但對陣列你不能找到這樣的。

/** 
* Returns a string representation of this collection. The string 
* representation consists of a list of the collection's elements in the 
* order they are returned by its iterator, enclosed in square brackets 
* (<tt>"[]"</tt>). Adjacent elements are separated by the characters 
* <tt>", "</tt> (comma and space). Elements are converted to strings as 
* by {@link String#valueOf(Object)}. 
* 
* @return a string representation of this collection 
*/ 
public String toString() { 
    Iterator<E> it = iterator(); 
    if (! it.hasNext()) 
     return "[]"; 

    StringBuilder sb = new StringBuilder(); 
    sb.append('['); 
    for (;;) { 
     E e = it.next(); 
     sb.append(e == this ? "(this Collection)" : e); 
     if (! it.hasNext()) 
      return sb.append(']').toString(); 
     sb.append(',').append(' '); 
    } 
} 
1

簡短的回答是因爲toString是在幾個不同的地方定義的,具有不同的行爲。

陣列類的toString定義爲一個靜態方法,要被調用等

Arrays.toString(arr_name); 

但是Arrays類也繼承從Object類的非靜態方法的toString。因此,如果調用實例,它會調用Object.toString,它返回對象的字符串表示形式(例如:[Ljava.lang.Object; @ 4e44ac6a)

所以,Arrays.toString()和MyObject.toString()是調用具有相同名稱的不同方法。

ArrayList類從類AbstractCollection類,它是一種非靜態方法繼承的toString,因此可以在對象上被調用,如:因爲它是一個集合的字符串表示,而不是一個對象

MyArrayList.toString(); 

,結果是可讀格式的值如[一,二]。

相關問題