2012-04-09 9 views
5

में java.lang.String के लिए संदर्भ समानता एक उम्मीद करेगा कि स्ट्रिंग्स अपरिवर्तनीय हैं, भले ही मूल्य-समानता और संदर्भ-समानता जावा के लिए समान नहीं होगी। लैंग। स्केल में ऑब्जेक्ट्स स्ट्रिंग। इसका मतलब है कि दो स्ट्रिंग-होल्डिंग val एस संदर्भ-बराबर नहीं होना चाहिए, भले ही उनके तार समान हों।स्कैला

scala> val s1 = "a"; val s2 = "a" 
s1: java.lang.String = a 
s2: java.lang.String = a 

scala> s1 eq s2 
res0: Boolean = true 

किसी भी विचार क्यों परिणाम false नहीं था: लेकिन यहाँ क्या मैं एक 2.9.1.final आरईपीएल में मिलता है? के बजाय List("a") के साथ एक ही प्रयोग अपेक्षित काम करता है। eq विधि को AnyRef में अंतिम के रूप में चिह्नित किया गया है। क्या कोई कंपाइलर जादू विशेष रूप से String या java.lang.String के लिए किया गया है?

उत्तर

13

हां यह कंपाइलर जादू है। विशेष रूप से, इसे इंटर्निंग कहा जाता है। जावा यह भी करता है, और यह केवल दक्षता कारणों के लिए है, जैसे स्मृति उपयोग और प्रत्येक चरित्र की तुलना किए बिना तुलना की अनुमति। यहां एक Wikipedia article on it है। आप intern() विधि के साथ मैन्युअल रूप से स्ट्रिंग्स को भी प्रशिक्षित कर सकते हैं।

4

Java language specification से:

एक स्ट्रिंग शाब्दिक वर्ग String (§4.3.1, §4.3.3) का एक उदाहरण के लिए एक संदर्भ है।

इसके अलावा, एक स्ट्रिंग अक्षर हमेशा कक्षा String के समान उदाहरण को संदर्भित करता है। ऐसा इसलिए है क्योंकि स्ट्रिंग अक्षर - या, आमतौर पर, स्ट्रिंग्स जो निरंतर अभिव्यक्तियों के मूल्य हैं (§15.28) - विधि String.intern का उपयोग करके अद्वितीय उदाहरण साझा करने के लिए "interned" हैं।

+0

धन्यवाद! दिलचस्प बात यह है कि जब मैं 'val s1 = "aa" से शुरू करने के लिए अपना उदाहरण बदलता हूं; वैल एस 2 = "ए" + "ए" ', परिणाम अभी भी वही है, भले ही" "एक" + "एक निरंतर अभिव्यक्ति नहीं है (है ना?)। तो ऐसा लगता है कि जावा स्पेक के मुकाबले स्काला थोड़ा अधिक करता है। –

+3

'" ए "+" ए "** ** ** निरंतर अभिव्यक्ति है, [निरंतर अभिव्यक्तियां] देखें (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html # जेएलएस -15.28) – fredoverflow

+1

निरंतर अभिव्यक्तियों के लिए जावा स्पेक स्कैला के लिए बिल्कुल समान नहीं लगता है। उदाहरण के लिए, उस कॉन्स्टेंट एक्सप्रेशन पेज पर दिए गए उदाहरणों में से एक का उपयोग करके, "पूर्णांक" + java.lang.Long.MAX_VALUE + "शक्तिशाली बड़ा है।" 'स्केलैक द्वारा प्रशिक्षित नहीं है। –