2015-08-26 9 views
5

मैं अभी भी जावा में एक नौसिखिया की तरह कर रहा हूँ के बीच का अंतर, क्या आप मुझे बता सकते हैं क्या इन दोनों निर्माताओं के बीच का अंतर?ऐरेलिस्ट, जावा। क्या इन दोनों कंस्ट्रक्टर्स

पहले:

public class Plan 
{ 

    ArrayList<Point2D> points; 

    public Plan(ArrayList<Ponto2D> points) 
    { 
     this.points = new Arraylist<Point2D>(points); 
    } 

} 

और इस: दूसरा:

public class Plan 
{ 

    public Plan(ArrayList<Point2D> lpoints) 
    { 
     points = new ArrayList<Point2D>(); 
     for(Point2D p : lpoints) point.add(p.clone()); 
    } 

} 
+2

कृपया इंडेंट के साथ सावधान रहें, आपका कोड – realUser404

+1

पढ़ने के लिए वास्तव में कठिन है पहला कन्स्ट्रक्टर संग्रह लेता है और उसे 'अंक' ऐरेलिस्ट को असाइन करता है, दूसरा कन्स्ट्रक्टर एक ऐरेलिस्ट लेता है, इसके माध्यम से पुनरावृत्त करता है, और 'अंक' में जोड़ता है 'अंक 'शुरू करने के बाद। – Abdul

+1

@ अब्दुल, पहला व्यक्ति पास की गई सूची निर्दिष्ट नहीं करता है, यह सूची की प्रतिलिपि बनाता है। –

उत्तर

1
पहले मामले में

, पैरामीटर ArrayList शेयर एक ही अंक (p1.equals (P2) सच हो सकता है, p1 = = p2 सच हो जाएगा) दूसरे मामले में , वे अंक (p1.equals (P2) सच होगा के विभिन्न प्रति है, लेकिन p1 == p2 झूठी होगा)

5

पहले निर्माता एक उथले प्रतिलिपि, दूसरा एक एक गहरी प्रतिलिपि है।

उत्तर this question के लिए S.Lott द्वारा दिए गए।

शैलो प्रतियों को जितना संभव हो उतना डुप्लिकेट करता है। संग्रह की एक उथली प्रति संग्रह संग्रह की एक प्रति है, तत्व नहीं। एक उथली प्रतिलिपि के साथ, दो संग्रह अब व्यक्तिगत तत्व साझा करते हैं।

दीप प्रतियां सब कुछ नकल। संग्रह की एक गहरी प्रति दो संग्रह है जो मूल संग्रह डुप्लीकेट के सभी तत्वों के साथ संग्रहित है।

+0

मेरा मानना ​​है कि पहले निर्माता वास्तव में सूची क्लोनिंग है, इसलिए तत्वों – realUser404

+0

@ realUser404 यह एक जाल है साझा नहीं! (: पी) पहला कन्स्ट्रक्टर सूची क्लोन करता है, लेकिन उसी तत्व को साझा करता है, दूसरा तत्व क्लोन() 'के लिए धन्यवाद तत्वों को डुप्लिकेट करता है। आप (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java) की [OpenJDK कार्यान्वयन] पर एक नज़र ले जा सकते हैं ' ArrayList', जो हुड के पीछे 'System.arraycopy (...) 'का उपयोग करता है। दूसरे मामले में – NiziL

3
this.points = new Arraylist<Point2D>(points); 

यह एक पूरी संग्रह लेता है और अपने points ArrayList initlaize के संग्रह का उपयोग करता है।

for(Point2D p : lpoints) point.add(p.clone()); 

ही परिणाम है, लेकिन अपने points सूची lpoints -collection एक एक करके के प्रत्येक तत्व कहते हैं कि।

तो अपने उपयोग के लिए, पहली संभावना का उपयोग करें।

+0

, यह point2D की एक ** प्रति **, जो काफी समान नहीं है कहते हैं –

1

अपना पहला निर्माता में आप एक ArrayList कि एक संग्रह लेता है के रूप में यह तर्क है बनाने के लिए डिफ़ॉल्ट जावा निर्माता का उपयोग करें।

(From Java Docs)

सार्वजनिक ArrayList (संग्रह <? फैली ई> ग)

क्रम में वे संग्रह के द्वारा दिया जाता है निर्दिष्ट संग्रह के तत्वों से युक्त एक सूची, निर्माणों इटरेटर।

यह मूलतः (अपने उदाहरण से) अपनी खुद की इटरेटर लेखन के समान है।

public Plan(ArrayList<Point2D> lpoints) { 
    points = new ArrayList<Point2D>(); 
    for(Point2D p : lpoints) 
     point.add(p.clone()); 
} 

इस उदाहरण में हालांकि हम .clone() नामक एक विधि का उपयोग करते हैं क्योंकि हम प्रत्येक ऑब्जेक्ट की उथली प्रतिलिपि नहीं चाहते हैं। हम उन्हें डुप्लिकेट करना चाहते हैं।

[संपादित करें]: दोनों उदाहरण एक ही बात नहीं करते हैं। पहला एक उथली प्रतिलिपि है और दूसरा एक गहरी प्रति है।

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