2015-10-30 8 views
6

बस उत्सुक, स्ट्रिंग के hashCode कार्यान्वयन में क्या एक hashCode कार्यान्वयन में अतिरिक्त संदर्भ निर्माण के पीछे का कारण है (v 1.8.0_65):hashCode कार्यान्वयन

public int hashCode() { 
    int h = hash; 
    if (h == 0 && value.length > 0) { 
     char val[] = value; 

     for (int i = 0; i < value.length; i++) { 
      h = 31 * h + val[i]; 
     } 
     hash = h; 
    } 
    return h; 
} 

को ध्यान में लेते हुए कि value अंतिम और बनाया है केवल कन्स्ट्रक्टर में (यानी थ्रेडसेफ) हमें वैरिएबल वैल [] संदर्भ क्यों चाहिए?

आईई। यह काम करेगा:

public int hashCode() { 
    if (hash == 0 && value.length > 0) { 
     int h = 0; 
     for (int i = 0; i < value.length; i++) { 
      h = 31 * h + value[i]; 
     } 
     hash = h; 
    } 
    return hash; 
} 

?

ढेर से मूल्यों की प्रतिलिपि बनाने के अलावा चीजों को कॉपी करने के अलावा यह @zapl द्वारा टिप्पणियों में वर्णित दौड़ की स्थितियों के बारे में भी है। जो उनकी टिप्पणी से पहले मुझे स्पष्ट नहीं था।

+0

यह getopt बचने के बारे में नहीं है पर स्पष्ट रूप से संभाल। यह http://jeremymanson.blogspot.de/2008/12/benign-data-races-in-java.html - डेटा रेस है क्योंकि 'हैश' न तो' अस्थिर 'है और न ही सिंक्रनाइज़ किया जा रहा है। यही कारण है कि वे 'हैश वापस नहीं' करते हैं (आपके द्वारा पढ़े जाने वाले मूल्य के बारे में कोई गारंटी नहीं है) – zapl

+0

मैं इस कथन से असहमत हूं। हैश int (लंबा नहीं) है, यानी सभी ऑप्स परमाणु हैं और सबसे बुरे मामले में आप इसे दो बार गणना करेंगे जो दोनों मामलों में हो सकता है। –

+0

यह परमाणु रूप से मूल्य निर्धारित करने के बारे में नहीं है लेकिन ऑपरेशन (पुनः) ऑर्डरिंग के बारे में है। आपके संस्करण के बारे में लिंक किए गए आलेख से: * मैंने जो कुछ किया है वह अतिरिक्त पढ़ने को जोड़ना है: वापसी से पहले हैश का दूसरा पठन। जैसा कि यह लगता है कि अजीब लगता है, और ऐसा होने की संभावना नहीं है, पहला पठन सही ढंग से गणना किए गए हैश मान को वापस कर सकता है, और दूसरा पठन 0 वापस कर सकता है! यह स्मृति मॉडल के तहत अनुमति है क्योंकि मॉडल संचालन की व्यापक पुनरावृत्ति की अनुमति देता है। दूसरा पठन वास्तव में आपके कोड में स्थानांतरित किया जा सकता है, ताकि आपका प्रोसेसर पहले से पहले ऐसा कर सके! * – zapl

उत्तर

1

ऐसा लगता है आशय की तरह hash डाल करने के लिए है और value ढेर

+0

डुप्लीकेट प्रश्न से लिंक का जवाब – ControlAltDel

+0

है। तुनाकी ने सही डुप्लिकेट चिह्नित किया। वे बार-बार डेटा लाने और लाने के लिए निर्देश नहीं चाहते हैं। आपके पास ढेर पर है। – TheLostMind

+0

वे * मामूली धीमी पहुंच * के बारे में चिंतित हैं * पी – TheLostMind

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