2013-08-01 6 views
11

मैं इस कोड को जेडीके 1.4 और 1.5 के साथ चला रहा हूं और विभिन्न परिणाम प्राप्त कर रहा हूं। यह मामला क्यों है?जेडीके 1.4 और 1.5 के बीच आउटपुट अलग क्यों है?

String str = ""; 
int test = 3; 

str = String.valueOf(test); 
System.out.println("str[" + str + "]\nequals result[" + (str == "3") + "]"); 

if (str == "3") { 
    System.out.println("if"); 
} else { 
    System.out.println("else"); 
} 

आउटपुट:

  • JDK पर

    1,4

    str[3] 
    equals result[true] 
    if 
    
  • JDK पर 1,5

    str[3] 
    equals result[false] 
    else 
    
+7

स्ट्रिंग समानता की जांच '3" के साथ की जाती है .equals (str) 'और' == 'ऑपरेटर के साथ नहीं। –

+0

इसका जेडीके के बीच के अंतर के साथ कुछ भी नहीं है, लेकिन जावा में 'स्ट्रिंग' तुलना कैसे काम करती है इसकी आपकी समझ है। जावा में ऑब्जेक्ट समानता की तुलना करने के लिए मेरी पिछली टिप्पणी – MadProgrammer

+0

में दिए गए लिंक को देखें, आपको = बराबर का उपयोग करना होगा, अगर वे उसी ऑब्जेक्ट पर प्रतिक्रिया दे रहे हैं ... यदि वे इंटर्न किए गए थे तो यह सच हो जाएगा। – nachokk

उत्तर

11

this page के अनुसार, Integer#toString विधि (जो String#valueOf(int) द्वारा कहा जाता है) 1.4 में इस तरह कार्यान्वित किया जाता है:

public static String toString(int i) { 
    switch(i) { 
     case Integer.MIN_VALUE: return "-2147483648"; 
     case -3: return "-3"; 
     case -2: return "-2"; 
     case -1: return "-1"; 
     case 0: return "0"; 
     case 1: return "1"; 
     case 2: return "2"; 
     case 3: return "3"; 
     case 4: return "4"; 
     case 5: return "5"; 
     case 6: return "6"; 
     case 7: return "7"; 
     case 8: return "8"; 
     case 9: return "9"; 
     case 10: return "10"; 
    } 
    char[] buf = (char[])(perThreadBuffer.get()); 
    int charPos = getChars(i, buf); 
    return new String(buf, charPos, 12 - charPos); 
} 

कि अपने परिणाम की व्याख्या करता है क्योंकि स्ट्रिंग शाब्दिक "3" प्रशिक्षु जाता है और "3" == "3" हमेशा सच देता है।

आप इसे सत्यापित करने के लिए 10 और 11 के साथ प्रयास कर सकते हैं।

नोट: जैसा कि पहले से ही उल्लेख किया गया है, Integer#toString का जावाडोक यह नहीं कहता है कि लौटाई गई स्ट्रिंग को इंटर्न किया जाएगा या नहीं, इसलिए आपके प्रश्न में दोनों आउटपुट समान रूप से मान्य हैं।

+2

+1 से सहमत हो सकता हूं जावा 7 में फिर से अलग है। आपको इस तरह के व्यवहार पर निर्भर नहीं होना चाहिए। –

4

यह एक इम्प है लीमेंटेशन विवरण जो जेएलएस द्वारा निर्दिष्ट नहीं है।

संदर्भ समानता ऑपरेटर == चेकों को देखने के लिए दो चर एक ही वास्तविक वस्तु को इंगित है कि क्या है, जबकि equals विधि जाँच करता है कि दो चर 'मूल्यों "बराबर" किसी तरह कि प्रोग्रामर द्वारा निर्धारित किया जा सकता है में हैं या नहीं। इस मामले में, ऐसा लगता है कि 1.4 जेवीएम इस तथ्य का लाभ उठा रहा है कि String एस "3" की उसी प्रतिलिपि का पुन: उपयोग करने के लिए अपरिवर्तनीय है जब आप valueOf पर कॉल करते हैं और 1.5 जेवीएम नहीं है। दोनों विकल्प पूरी तरह से कानूनी हैं, और आपको किसी विशेष व्यवहार पर निर्भर नहीं होना चाहिए।

0

यदि आप स्ट्रिंग अक्षरों के संचालन पर "==" ऑपरेटर का उपयोग कर रहे हैं, तो यह इस बात पर निर्भर करता है कि स्ट्रिंग अक्षर का मूल्य "स्ट्रिंग पूल" पर मौजूद है या नहीं, आपके केस वैरिएबल "str" ​​में एक स्ट्रिंग JVM है पहली बार "स्ट्रिंग पूल" पर चेक करता है यदि यह पाया जाता है तो यह सत्य और गलत लौटाता है। प्रशिक्षु() विधि के लिए दस्तावेज़ के अनुसार पर "स्ट्रिंग पूल"

String str = ""; 
int test = 3; 

str = String.valueOf(test).intern(); 

System.out.println("str[" + str + "]\nequals result[" + (str == "3") + "]"); 

if (str == "3") { 
    System.out.println("if"); 
} else { 
    System.out.println("else"); 
} 

स्ट्रिंग शाब्दिक उपलब्ध बनाने के लिए विधि प्रशिक्षु() के साथ निम्नलिखित कोड का प्रयास करें,: प्रशिक्षु() विधि के लिए तार का एक आंतरिक तालिका खोज एक स्ट्रिंग के बराबर एक स्ट्रिंग। यदि स्ट्रिंग तालिका में नहीं है, तो यह जोड़ा जाता है। तालिका में निहित स्ट्रिंग का उत्तर देता है जो इस स्ट्रिंग के बराबर है। एक ही स्ट्रिंग ऑब्जेक्ट को तारों के लिए हमेशा उत्तर दिया जाता है जो बराबर होते हैं।

अच्छी तरह से स्ट्रिंग तुलना के लिए "== "ऑपरेशन की अनुशंसा नहीं की जाती है। बराबर() या equalsIgnoreCase() विधि() का उपयोग करें।

मैंने जावा 1 में भी कोशिश की।7 प्रशिक्षु के बिना() उत्पादन

str[3] 
equals result[false] 
else 

प्रशिक्षु के साथ (है) उत्पादन की बात आती है:

str[3] 
equals result[true] 
if 

इस JDK 1.4 की समस्या नहीं है और 1.5 यह एक "तार्किक है त्रुटि "।

1

जावा 5 string.valueof() से नई स्ट्रिंग लौटने की उम्मीद है। इंटर्न (एड) (साझा) स्ट्रिंग के बजाय!

जावा में उदाहरण

int test = 3; 
    String str = String.valueOf(test); 
    String str2 = String.valueOf(test); 

    if(str == str2) 
     System.out.println("valueOf return interned string"); 
    else 
     System.out.println("valueOf does not return interned string"); 

आउटपुट> = 5

valueOf does not return interned string 

लेकिन जावा में निम्नलिखित पर विचार करें 4 उत्पादन

valueOf return interned string 

व्यवहार बताते हैं यही कारण है!

+0

आप जो कुछ भी पहले से देख चुके थे उसे बहाल कर रहे हैं। सवाल यह है कि 1.4 और 1.5 अलग-अलग व्यवहार क्यों करते हैं। – assylias

+0

क्योंकि जावा में 5 नई स्ट्रिंग इंटर्न (एड) (साझा) स्ट्रिंग के बजाय बनाई गई है। पहली बोल्ड लाइन देखें! –

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