2013-09-05 8 views
24

जावा 7 नीचेक्या स्ट्रिंग उपयोग के साथ जावा 7 स्विच स्टेटमेंट बराबर() विधि है?

switch (month.toLowerCase()) { 
case "january": 
    monthNumber = 1; 
    break; 
case "february": 
    monthNumber = 2; 
    break; 
default: 
    monthNumber = 0; 
    break; 
} 

करता जावा प्रत्येक String मामले पर equals() विधि कॉल कोड की तरह Strings साथ स्विचन का समर्थन करता है? या यह == या intern() पर निर्भर करता है?

यह बस के बराबर है:

String month = month.toLowerCase(); 
if("january".equals(month)){ 
monthNumber = 1; 
}else if("february".equals(month)){ 
monthNumber = 1; 
}.. 

अद्यतन:

स्विच अभिव्यक्ति में स्ट्रिंग भाव से की जाती है प्रत्येक मामले लेबल अगर रूप String.equals विधि थे के साथ जुड़े का उपयोग किया जा रहा है।

जैसे दस्तावेज़ बताते हैं कि व्यवहार equals() कहा जाता है।

+0

1) मुझे लगता है कि होना चाहिए यह करने के लिए होता है कि पाया? 2) क्या आपने सोर्स कोड देखा है? –

+0

@ होवरक्राफ्टफुलऑफेल - यह '==' का उपयोग कर सकता है और 'इंटर्न' पर भरोसा कर सकता है - लेकिन मुझे लगता है कि कई मामलों में तोड़ देगा। – OldCurmudgeon

+0

@ ओल्डकुरमुडियन: बहुत जोखिम भरा, मुझे लगता है। –

उत्तर

22

docs कहना

The String in the switch expression is compared with the expressions associated 
with each case label as if the String.equals method were being used. 

चूंकि यह कहते के रूप में अगर मेरा अनुमान होगा यह नहीं करता, हालांकि आंतरिक कार्यान्वयन .equals रूप में एक ही() विधि होगा।

+0

क्या कोई अन्य तंत्र है जो एक कंपाइलर उपयोग कर सकता है जो स्ट्रिंग कार्यान्वयन के विवरण पर भरोसा नहीं करेगा, जो वर्चुअल विधि कॉल से पहले पूर्व-जांच संदर्भ समानता के अलावा भविष्य में कार्यान्वयन की अनुमति होगी, और शायद हैशिंग से पहले भी? ] – supercat

3

switch बयान जब एक String के साथ प्रयोग किया case बयान में प्रत्येक मान को दी अभिव्यक्ति की तुलना करने के equals() विधि का उपयोग करता है और इसलिए केस-संवेदी है और एक NullPointerException फेंक देंगे अगर अभिव्यक्ति null है।

6

हां।

"स्विच बयान जब एक स्ट्रिंग के साथ इस्तेमाल किया() विधि मामले बयान में प्रत्येक मान को दी अभिव्यक्ति की तुलना करने के बराबर का उपयोग करता है और इसलिए केस-संवेदी है और एक NullPointerException फेंक देंगे अगर अभिव्यक्ति शून्य है।"

http://java.dzone.com/articles/new-java-7-feature-string

+1

कुछ यादृच्छिक ब्लॉग पोस्ट का कहना है कि इसका मतलब यह नहीं है कि यह सही है। – cowls

+1

मैंने वास्तव में इस विषय पर एक उचित बिट शोध किया था, मेरे जवाब में मैंने उपयोग किए गए संसाधनों में से एक था। –

7

जावा 7 स्विच स्टेटमेंट वास्तव में बाइटकोड उत्पन्न करता है जो hashCode() और equals() विधियों दोनों का उपयोग करता है। हैश कोड का उपयोग तेजी से स्विच लुकअप उत्पन्न करने के लिए किया जाता है; यानी बराबर जांच की एक श्रृंखला से बचने के लिए जैसे कि आप एक और-श्रृंखला के साथ मिलेंगे।

+0

क्या हैश कोड की गणना करने से पहले यह कभी संदर्भ समानता के लिए परीक्षण करता है? मुझे लगता है कि यह बहुत आम होगा कि एक स्विच वैल्यू संदर्भ-लेबल स्विच में से एक के बराबर होगा। – supercat

+0

नहीं, मुझे ऐसा नहीं लगता है। ऐसा लगता है कि पहले हैशकोड की गणना करना है, उस हैशकोड के लिए स्ट्रिंग के साथ अनुभाग पर जाएं और फिर उन स्ट्रिंग्स (आमतौर पर केवल एक) पर बराबर जांचें। – Steinar

+0

दिलचस्प। मुझे लगता है कि 'स्विच' कथन को दिए गए स्ट्रिंग आधा समय से अधिक अक्षर होंगे, हालांकि मुझे लगता है कि हैशिंग अभी भी जीत हो सकती है * अगर * या तो हैश कोड की गणना पहले से की गई है * या * इसकी आवश्यकता होगी भविष्य। – supercat

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