2013-03-15 4 views
5

क्योंकि जेवीएम स्ट्रिंग के लिए स्ट्रिंग पूल का प्रबंधन करता है, जिससे यह किसी भी नए स्ट्रिंग असाइनमेंट के लिए दिखता है, इसी तरह, क्या हम किसी अन्य ऑब्जेक्ट या प्राइमेटिव्स का पूल विकसित कर सकते हैं?स्ट्रिंग के समान ऑब्जेक्ट पूल बनाना संभव है?

उत्तर

4

जावा स्ट्रिंग स्थिरांक के लिए आंतरिक पूल जावा कंपाइलर के लिए कुछ ज्ञात है, इसलिए आप अपने द्वारा सटीक व्यवहार की नकल नहीं कर सकते हैं।

पूल स्वयं ही हैश मानचित्र से अधिक कुछ नहीं है। यदि आपके ऑब्जेक्ट में उपयुक्त पहचानकर्ता है, तो आप निश्चित रूप से अपनी ऑब्जेक्ट्स के लिए पूल रोल कर सकते हैं: बस एक स्थिर विधि बनाएं जो एक कुंजी लेती है, इसे स्थिर हैश मैप में दिखती है, और केवल एक नई ऑब्जेक्ट बनाता है अगर इसे पूल नहीं किया गया हो अभी तक। नोट, हालांकि, इस सरल योजना के लिए काम करने के लिए आदेश में, आपके ऑब्जेक्ट को अपरिवर्तनीय होना आवश्यक है।

+0

इसलिए मूल रूप से स्थिर हैश मैप को बनाए रखना पूलिंग को दोहराएगा। सही? और इसका मतलब पूल-प्रकार में फ़ील्ड की संख्या कम है, कैशिंग का अधिक प्रभावी/कुशल होगा? – Ankit

+1

@ ay89 सामान्य रूप से, पूलिंग केवल तभी प्रभावी होगी जब आपके द्वारा बनाई गई वस्तुओं के बीच बहुत अधिक नकल हो। आपके पास अपने पते, फोन नंबर इत्यादि के साथ ग्राहक का प्रतिनिधित्व करने वाले 30 फ़ील्ड वाले ऑब्जेक्ट हो सकते हैं। यदि आपके पास केवल 100 ग्राहक हैं, तो आपके पूलिंग बहुत सारे फ़ील्ड वाले वर्गों के साथ भी बहुत कुशल होंगे। यदि, दूसरी तरफ, आप कक्षाओं को पूल करने का प्रयास करते हैं जो 2 डी (पूर्णांक के जोड़े) में निर्देशांक का प्रतिनिधित्व करते हैं, और इसे 10,000 यादृच्छिक रूप से जेनरेट किए गए निर्देशांक के सेट पर उपयोग करते हैं, कैशिंग बिल्कुल कुशल नहीं होने वाली है, भले ही केवल दो फ़ील्ड – dasblinkenlight

+0

ठीक है, लेकिन यदि बड़ी संख्या में फ़ील्ड की अधिक डुप्लिकेट ऑब्जेक्ट्स हैं, तो पूलिंग मेमोरी के मामले में प्रभावी होगी। लेकिन साथ ही, मुझे लगता है कि यह अधिक समय का उपभोग करेगा, यह तय करने के लिए कि संख्या वस्तु डुप्लिकेट है या नहीं, बड़ी संख्या में फ़ील्ड की तुलना करें। सही? – Ankit

3

स्ट्रिंग पूल जावा, पूर्णांक और अन्य आवरण कक्षाओं में केवल पूल/कैश नहीं है कैश का उपयोग करें, आपको एक उदाहरण

public static Integer valueOf(int i) { 
    assert IntegerCache.high >= 127; 
    if (i >= IntegerCache.low && i <= IntegerCache.high) 
     return IntegerCache.cache[i + (-IntegerCache.low)]; 
    return new Integer(i); 
} 

आप भी एक बार देख ले सकते हैं के रूप में पूर्णांक स्रोत कोड पर एक नज़र ले जा सकते हैं http://commons.apache.org/proper/commons-pool//

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