2012-08-10 5 views
5

के लिए अधिकतम आकार StringBuffer के आकार पर इसकी सीमा क्यों होगी?स्ट्रिंगबफर

मैं कुछ लिंक से गुज़र गया: http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer

क्या यह गणना सदस्य चर के कारण है, जो एक int है?

मान लीजिए कि हमारे पास StringBuffer में 2^31-1 वर्ण हैं और हम StringBuffer पर कुछ और वर्ण जोड़ते हैं। गिनती सदस्य चर को वर्णित वर्णों की संख्या से बढ़ाया जाएगा और यदि गणना चर पहले से ही अधिकतम (2^31-1) पर है, तो यह वापस कुछ नकारात्मक मान पर वापस आ जाएगा।

यह एक त्रुटि क्यों फेंक देगा?

+0

एक StringBuffer का उपयोग न करें जब आप एक StringBuilder (यह एक ही सीमा होती है, हालांकि) –

+1

एक 2 का उपयोग कर सकते^32-1 स्ट्रिंगबिल्डर 4 जीबी लेगा। क्या आप इतनी लंबी स्ट्रिंग बनाना चाहते हैं? –

उत्तर

13

क्योंकि StringBuffer आंतरिक रूप से एक सरणी और तत्वों की अधिकतम संख्या एक सरणी समायोजित कर सकते हैं का उपयोग करता है 2^31-1 है अगर आप इस तक पहुंचने के बाद भी वृद्धि यह नकारात्मक के लिए जाना जाएगा और त्रुटि

+0

सरणी में तत्वों की संख्या पर अधिकतम सीमा क्यों है, क्या जावा चश्मे का उल्लेख किया गया है? – vjk

+0

@vjk यादृच्छिक सरणी पहुंच स्थिति के लिए एक पूर्णांक का उपयोग करता है। यानी: myArray [8]। आप MAX_INT + 1 स्थिति पर तत्वों का उपयोग कैसे करेंगे? –

+0

बस आकार की एक सरणी बनाने का प्रयास करें कुछ लंबे मूल्य –

0

अगर आप कहीं भी हो रही है फेंकता आपके बफर में 2^31 वर्णों के करीब आप इसे गलत कर रहे हैं और आप बहुत पहले स्मृति से बाहर हो गए होंगे।

+4

मैं इस बिंदु पर आपसे सहमत हूं कि वह गलत कर रहा है। हालांकि सोचने का कोई कारण नहीं है कि वह स्मृति से बाहर होगा। –

4

StringBufferchar[] का उपयोग करता है।
जावा में एक सरणी को केवल एक पूर्णांक के माध्यम से अनुक्रमित किया जा सकता है जिसका अर्थ है कि सरणी का सूचकांक उच्चतम मान Integer.MAX_VALUE - 1 (यानी 2^31 - 1) हो सकता है। जिसका अर्थ है कि जावा में किसी सरणी का आकार Integer.MAX_VALUE

3

से अधिक नहीं हो सकता है, सिस्टम आर्किटेक्चर के आधार पर उत्तर अलग है।

यह पुरानी मशीन जब मैं 2012 को उत्तर पोस्ट पात्रों में से

अधिकतम लंबाई =

जावा संस्करण: 1.6.0_35

ओएस: विंडोज 7

सिस्टम आर्किटेक्चर: 32 बिट्स (x86)

,210

रैम: 2 जीबी

प्रोसेसर: पेंटियम डुअल कोर E5800 3.20GHz

पर 2016

अधिकतम अक्षर की लंबाई =

जावा संस्करण: 1.8

ओएस: उबंटू 14 एलटीई और विंडोज 7

प्रणाली वास्तुकला: 64bits (x86_64)

रैम: 8 जीबी

प्रोसेसर: इंटेल (आर) कोर (टीएम) i3-4130 सीपीयू @ 3।40GHz

भागो इस कार्यक्रम अपने आप

 StringBuffer strbTest = new StringBuffer(); 
     long len = 0; 
     try { 
      System.out.println("Wait.... til number not generated."); 

      while(true) { 
       strbTest.append("a"); 
       len++; 
      } 
     } catch (OutOfMemoryError e) { 
      System.out.println("Max length on your system is "+len); 
      System.out.println("Error"); 
     } 
     System.out.println("End"); 

आउटपुट

Max length on your system is 37748734 
+0

यूप, मैंने भाग लिया और सटीक वही मूल्य प्राप्त किया -> 37748734. मेरा सिस्टम भी एक सी 2 डी ई 7500 और 4 गीगा रैम है। मैं 32 बिट विंडोज़ चला रहा हूँ। इंटेगर MAX VALUE 2147483647 है। – avinashkr

+0

मैं भाग गया और मैंने पोस्ट किया से अलग जवाब मिला: 301 9 8 9 86, x86_64 मशीन 8 जीबी राम, जावा 1.8 और 4 गीगाहर्ट्ज प्रोसेसर। अन्य x86_64 सिस्टम पर वही संख्या मिली। –

+0

आपके जेवीएम संस्करण और प्लेटफ़ॉर्म में स्ट्रिंगबफर वर्ग का प्रभाव क्या है ... जब इसे अपनी क्षमता का विस्तार करने की आवश्यकता होती है, तो यह लोड कारक का उपयोग कर सकती है और, इंटीजर.एमएक्स_वीALUE (2^31 - 1 का उपयोग कर सकती है क्योंकि हर कोई इंगित कर रहा है बाहर) उड़ने से पहले अधिकतम क्षमता के लिए ... इसलिए यदि आपको वह मान नहीं मिलता है तो ऐसा इसलिए होता है क्योंकि आपका कार्यान्वयन केवल सरणी का विस्तार कर रहा है जब तक कि यह ओवरफ़्लो का पता नहीं लगाता ... यह उड़ने से पहले Integer.MAX_VALUE की कोशिश करता है: http: // grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/AbstractStringBuilder.java#AbstractStringBuilder.expandCapacity%28int%29 – Renato

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

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