2012-12-08 27 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); 

में सरणी और ArrayList वस्तु के बीच अलग काम करती है list[a, b, c] जबकि array के लिए कुछ पता उत्पादन होता है उत्पादन होता है। जब हम array मानों को आउटपुट करना चाहते हैं, तो हम Arrays.toString(array); का उपयोग कर सकते हैं जो list जैसा काम करता है।क्यों toString() विधि जावा

मुझे आश्चर्य है कि हम मूल्य प्राप्त करने के लिए toString() पर सीधे array पर क्यों कॉल नहीं कर सकते हैं। क्या ऐसा करने के लिए यह अधिक सहज और सुविधाजनक नहीं है? Array और ArrayList पर विभिन्न उपचारों के परिणाम क्या हैं?

उत्तर

11

एक सरणी और सरणीसूची के बीच मुख्य अंतर यह है कि एक सरणीसूची जावा में लिखी गई एक कक्षा है और इसका अपना कार्यान्वयन है (toString को ओवरराइड करने का निर्णय सहित) जबकि सरणी भाषा विनिर्देश का हिस्सा हैं। विशेष रूप से, JLS 10.7 कहता है:

एक सरणी प्रकार के सदस्यों के सभी कर रहे हैं निम्नलिखित:

  • सार्वजनिक अंतिम क्षेत्र लंबाई
  • सार्वजनिक विधि क्लोन है, जो की विधि को ओवरराइड करता है कक्षा वस्तु में एक ही नाम और कोई चेक अपवाद फेंकता है।
  • क्लास ऑब्जेक्ट से विरासत में सभी सदस्यों को विरासत में मिला; ऑब्जेक्ट का एकमात्र तरीका विरासत में नहीं है इसकी क्लोन विधि है।

दूसरे शब्दों में भाषा विनिर्देश एक सरणी के toString विधि ओवरराइड किया जा करने के लिए होने से बचाता है और यह इसलिए डिफ़ॉल्ट कार्यान्वयन Object में परिभाषित किया गया है जो वर्ग के नाम और hashCode प्रिंट उपयोग करता है।

क्यों इस निर्णय लिया गया हो एक सवाल है कि शायद भाषा के डिजाइनरों के लिए कहा जाना चाहिए है ...

+0

यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/10295995/829571)। – assylias

4

मुझे आश्चर्य है कि हम मान प्राप्त करने के लिए सीधे सरणी पर क्यों नहीं जा सकते हैं।

वास्तव में toString विधि सरणी ऑब्जेक्ट पर कॉल किया जाता है। लेकिन, चूंकि सरणी प्रकार वर्ग से toString विधि को ओवरराइड नहीं करता है, इसलिए toString का डिफ़ॉल्ट कार्यान्वयन लागू किया गया है, जो आपके द्वारा देखे जाने वाले फ़ॉर्म का प्रतिनिधित्व देता है।

प्रतिनिधित्व फार्म की है: -

[[email protected] 

आपके मामले में यह कुछ की तरह है: -

[Ljava.lang.String;@3e25a5 

जबकि, ArrayList उदाहरणों के मामले में, ArrayList वर्ग में ओवरराइड toString विधि है सक्रिय किया गया।

0

क्योंकि जब आप toString(), यह मुद्रण डिफ़ॉल्ट प्रिंट [email protected] द्वारा।

तो, जब आप array प्रिंट करते हैं तो उपरोक्त मुद्रित किया जाएगा।

लेकिन ArrayListAbstractCollection वर्ग द्वारा extened जाता है और जहां 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 में यह वर्ग Objectटूस्ट्रिंग() विधि ओवरराइड करता है।

toString() ArrayList

0

इस के कार्यान्वयन ArrayList के लिए toString विधि कॉल है। लेकिन Arrays के लिए आप ऐसा नहीं मिल सकता है।

/** 
* 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 की तरह

Arrays.toString(arr_name); 

लागू किया जा करने के लिए लेकिन सरणी वर्ग भी वस्तु वर्ग से गैर स्थैतिक विधि toString इनहेरिट करती है। तो अगर किसी उदाहरण पर बुलाया जाता है, तो यह ऑब्जेक्ट .toString को आमंत्रित करता है जो ऑब्जेक्ट का स्ट्रिंग प्रस्तुति देता है (उदाहरण: [Ljava.lang.Object; @ 4e44ac6a)

तो Arrays.toString() और MyObject.toString() हैं एक ही नाम के साथ विभिन्न तरीकों को बुलाओ।

ArrayList वर्ग AbstractCollection वर्ग है, जहां यह एक गैर स्थिर तरीका है से toString इनहेरिट करती है, तो जैसे वस्तु पर कहा जा सकता है:

MyArrayList.toString(); 

क्योंकि यह एक संग्रह की एक स्ट्रिंग प्रतिनिधित्व और नहीं एक वस्तु है , नतीजे एक पठनीय प्रारूप में मान हैं जैसे [एक, दो]।

संबंधित मुद्दे