2013-06-08 3 views
5

मैं setCharAt(int index, char ch) के लिए एक StringIndexOutOfBoundsException मिला:सरल StringBuilder निर्माता/विधि मुद्दा

StringBuilder word = new StringBuilder(4); 

for(int i = 0; i < 4; i++) 
    word.setCharAt(i,'-'); 

StringBuilder(int capacity): में कोई अक्षर और क्षमता तर्क द्वारा निर्दिष्ट एक आरंभिक क्षमता के साथ एक स्ट्रिंग बिल्डर निर्माण करती है।

setCharAt(int index, char ch): निर्दिष्ट अनुक्रमणिका पर वर्ण ch पर सेट है।

केवल एक चीज मैं के बारे में सोच सकते हैं कि कोई स्मृति आवंटित किया गया था, लेकिन फिर StringBuilder(int capacity) की बात क्या है?

+1

_capacity_ तर्क/कन्स्ट्रक्टर के उद्देश्य से यहां [कुछ चर्चा] (http://stackoverflow.com/a/3184277/778118) है। – jahroy

उत्तर

4

केवल एक चीज मैं के बारे में सोच सकते हैं कि कोई स्मृति आवंटित किया गया है, लेकिन फिर StringBuilder (पूर्णांक क्षमता) की बात क्या है?

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

व्यवहार वास्तव में अजीब या अप्रत्याशित नहीं है, वास्तव में यह encapsulation के अभ्यास के साथ काफी संगत है।

ArrayList क्या होगा? एक ArrayList एक सरणी द्वारा समर्थित है, और पर्याप्त प्रारंभिक क्षमता का उपयोग करना अधिक प्रदर्शनकारी है, हालांकि ऐसा करने से सरणी के सूचकांक तक मनमाने ढंग से पहुंच की अनुमति नहीं मिलती है।

मुझे लगता है कि अजीब व्यवहार StringBuilder केके प्रतिनिधित्व के रूप में सोच रहा है। इस पर प्रतिनिधित्व ठीक से encapsulated है, इस पर उत्सुक तरीके से पोक मत करो।

6

बस StringBuilder में डेटा डाल करने के लिए StringBuilder.append()

निर्माता आप उपयोग कर रहे करता है कुछ भी नहीं का उपयोग करें।

यह केवल स्ट्रिंगबिल्डर के लिए एक व्यावहारिक आकार निर्दिष्ट करता है (जो मैं मानता हूं प्रदर्शन के लिए है)।

जब तक आप वास्तव में स्ट्रिंगबिल्डर में सामान नहीं डालते, तो आपका कोड अपवादों को फेंक देगा।

ध्यान दें कि प्रलेखन आप उद्धृत किया है इस स्पष्ट रूप से कहते हैं:

"कोई वर्णउस में से एक स्ट्रिंग बिल्डर निर्माणों ..."

+0

वास्तव में यह है कि मैं क्या कर रहा था। मैं बस सोच रहा था कि रचनाकार वास्तव में क्या करता है, अगर कोई स्मृति आवंटित नहीं करता है? मैं समझता हूं कि कोई पात्र नहीं है, लेकिन ऐसा होने की आवश्यकता क्यों है? –

+2

मैं पता लगाने के लिए स्रोत कोड पढ़ने का सुझाव देता हूं। मेरा मानना ​​है कि क्षमता का मुख्य रूप से प्रदर्शन के लिए आंतरिक रूप से उपयोग किया जाता है (जैसा कि स्ट्रिंगबिल्डर बढ़ता है), लेकिन मुझे यकीन नहीं है। – jahroy

3

यह StringBuilder में एक अजीब व्यवहार की तरह लगता है।

AbstractStringBuilder(int capacity) { 
    value = new char[capacity]; 
} 

हालांकि, जब setCharAt() का उपयोग कर, हम count बजाय जाँच:

AbstractStringBuilder (जो इसे विरासत) में, निर्माता के रूप में परिभाषित किया गया है

public void setCharAt(int index, char ch) { 
    if ((index < 0) || (index >= count)) 
     throw new StringIndexOutOfBoundsException(index); 
    value[index] = ch; 
} 

तो, क्योंकि हम नहीं था प्रारंभिक कन्स्ट्रक्टर का उपयोग करके count सेट करें, हमारे चेहरे में एक त्रुटि डाली गई है।

count में append(), replace(), insert(), और setLength() नए सिरे से परिभाषित किया गया है। आप solve your problem by also calling setLength(4) कर सकते हैं; हालांकि, as @jahroy pointed out, append() का उपयोग करना आसान है।

प्रासंगिक स्रोत कोड: StringBuilder, AbstractStringBuilder

+0

मैंने कभी स्रोत को नहीं देखा है, लेकिन मुझे लगता है कि यह ऐसा कुछ दिख रहा था, यही कारण है कि जब मुझे अपवाद मिला तो मैं इतनी उलझन में था। –

+0

@SteveP। हाँ ... तकनीकी रूप से, यह * आपको * देना चाहिए। लेकिन 'value.length' की जांच करने के बजाय, यह 'गिनती' की जांच करता है जिसे अपडेट नहीं किया गया था। वास्तव में यह कहना मुश्किल है कि यह डिज़ाइन द्वारा है या नहीं। – Eric

+0

@Eric मैं आपको टिप्पणी करने के लिए वोट देना चाहता हूं। इसे देखें: http://stackoverflow.com/a/16994970/122207 –

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