2013-03-22 5 views
9

मेरी कक्षाओं में से एक में मेरे पास Character प्रकार का क्षेत्र है। मैंने इसे char से अधिक पसंद किया क्योंकि कभी-कभी फ़ील्ड में "कोई मूल्य नहीं" और null सीम मुझे इस (कमी की) जानकारी का प्रतिनिधित्व करने का सबसे साफ तरीका है।जावा कैरेक्टर बनाम चार: स्मृति उपयोग के बारे में क्या?

हालांकि मैं इस दृष्टिकोण की स्मृति पदचिह्न के बारे में सोच रहा हूं। मैं सौ हजार वस्तुओं से निपट रहा हूं और दो विकल्पों के बीच नगण्य अंतर अब कुछ जांच के लायक हो सकता है।

मेरी पहली शर्त यह है कि char दो बाइट लेता है जबकि Character एक वस्तु है, और इसलिए इसके जीवन चक्र का समर्थन करने के लिए यह बहुत अधिक होता है। लेकिन मुझे Integer, Character जैसे बॉक्स किए गए प्राइमेटिव्स पता हैं और इसलिए सामान्य कक्षाएं नहीं हैं (मुक्केबाजी और अनबॉक्सिंग के बारे में सोचें), इसलिए मुझे आश्चर्य है कि क्या JVM हुड के तहत किसी प्रकार का अनुकूलन कर सकता है।

इसके अलावा, Character एस कचरा अन्य सामान की तरह एकत्रित है या एक अलग जीवन चक्र है? क्या वे एक साझा भंडार से पूल किए गए हैं? क्या यह मानक या जेवीएम कार्यान्वयन-निर्भर है?

मुझे इस मुद्दे के बारे में इंटरनेट पर कोई स्पष्ट जानकारी नहीं मिली। क्या आप मुझे कुछ जानकारी के लिए इंगित कर सकते हैं?

+0

के लिए '\ 0' एक के रूप में इस्तेमाल किया जा सकता * कोई मूल्य * चार – UmNyobe

+0

ज़रूर, मैं इस बारे में पता। :) एप्लिकेशन डोमेन को देखते हुए मैं ~, # या एक चीनी चरित्र का भी उपयोग कर सकता हूं, लेकिन यह – gd1

+0

बिंदु नहीं है, तो प्राइमेटिव हमेशा तेज होते हैं, ऑब्जेक्ट्स के साथ-साथ कम स्मृति प्राप्त करते हैं क्योंकि हम सभी जानते हैं कि हम स्ट्रिंग पर चार सरणी पसंद करते हैं। (जावा में सरणी के रूप में एक वस्तु है लेकिन यह एक बहस योग्य मुद्दा है: डी) – Freak

उत्तर

1

क्या आप Character उपयोग कर रहे हैं तो चरित्र बनाने के लिए उपयोग करने के लिए

Character.valueOf('c'); // it returns cached value for 'c' 

Character c = new Character('c');// prefer to avoid 

बाद जावाडोक से एक अंश है पसंद करते हैं।

एक नए चरित्र उदाहरण की आवश्यकता नहीं है, तो इस विधि Character.valueOf() आम तौर पर वरीयता में निर्माता Character(char) के लिए इस्तेमाल किया जाना चाहिए, क्योंकि इस विधि अक्सर अनुरोध किया मूल्यों कैशिंग द्वारा काफी बेहतर स्थान और समय प्रदर्शन उपज की संभावना है।

+0

दरअसल, मैं इसे मुक्केबाजी द्वारा पूरी तरह से बना देता हूं। – gd1

+1

@ जीडी 1 मुक्केबाजी उपलब्ध होने पर कैश किए गए मानों का उपयोग करेगी। – assylias

+0

आपको इसे 'कैरेक्टर' के लिए जावप के साथ जांचना होगा, लेकिन 'इंटेगर' 'valueOf' के लिए उपयोग किया जाएगा। –

0

आप कहा गया है, एक Character वस्तु, null हो सकता है तो यह एक नियमित रूप से char जो नल नहीं हो सकता से रैम में अधिक जगह लेने के लिए है: एक तरह से, Character रों char रों का सुपरसेट कर रहे हैं।

हालांकि, अपने कोड की दी गई हिस्से में, JIT कम्पाइलर पता लगाने के लिए कि आप Character कभी नहीं रिक्त है एक हमेशा एक नियमित char के रूप में प्रयोग किया जाता है और अनुकूलन उस भाग में सक्षम ताकि आपके Character कोई और अधिक रैम या निष्पादन का उपयोग करता है हो सकता है धीमा नहीं है मैं बस इस बिंदु पर अनुमान लगा रहा हूं, हालांकि, मुझे नहीं पता कि एक जेआईटी वास्तव में इस सटीक अनुकूलन को निष्पादित कर सकता है या नहीं।

0

इसके बजाय int का उपयोग करें। "नो चार" का प्रतिनिधित्व करने के लिए -1 का उपयोग करें।

इस पद्धति की श्रेष्ठता के बहुत सारे हैं, उदाहरण के int read() in java.io.Reader

+0

फिर उमनीब की टिप्पणी की तरह ... मैं आपकी अच्छी सलाह की सराहना करता हूं, लेकिन मैं खुद इस तरह के कामकाज के बारे में सोच सकता हूं ... असल में सबकुछ वैकल्पिक पैटर्न के रूप में किया जा सकता है। प्रश्न, फिर भी, इसके बारे में नहीं है। – gd1

+0

नहीं ... मैं यहां 'int' के बारे में बात कर रहा हूं, यह आपके मामले में, "कोई char" का एक सेंटीनेल मान, सभी वर्णों का प्रतिनिधित्व कर सकता है। किसी भी char 0x0000-0xFFFF के लिए सेंटीनेल मान को गलत नहीं किया जा सकता है। यह एक आम प्रथा है, 'Reader.read() 'के javadoc देखें। – ZhongYu

+0

ठीक है, मैं हार मानता हूं। कोई बात नहीं। – gd1

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