जावा में, अगर मेरे पास एक स्ट्रिंग है, तो मैं xउस स्ट्रिंग में बाइट्स की संख्या की गणना कैसे कर सकता हूं?
जावा में, अगर मेरे पास एक स्ट्रिंग है, तो मैं xउस स्ट्रिंग में बाइट्स की संख्या की गणना कैसे कर सकता हूं?
जवाबों:
एक स्ट्रिंग वर्णों की एक सूची है (यानी कोड अंक)। स्ट्रिंग को दर्शाने के लिए लिए गए बाइट्स की संख्या पूरी तरह से इस बात पर निर्भर करती है कि आप इसे बाइट्स में बदलने के लिए किस एन्कोडिंग का उपयोग करते हैं ।
उस ने कहा, आप स्ट्रिंग को बाइट सरणी में बदल सकते हैं और फिर इसके आकार को निम्नानुसार देख सकते हैं:
// The input string for this test
final String string = "Hello World";
// Check length, in characters
System.out.println(string.length()); // prints "11"
// Check encoded sizes
final byte[] utf8Bytes = string.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "11"
final byte[] utf16Bytes= string.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "24"
final byte[] utf32Bytes = string.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "44"
final byte[] isoBytes = string.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "11"
final byte[] winBytes = string.getBytes("CP1252");
System.out.println(winBytes.length); // prints "11"
तो आप देखते हैं, यहां तक कि एक सरल "एएससीआईआई" स्ट्रिंग में इसके प्रतिनिधित्व में विभिन्न बाइट्स हो सकते हैं, जिसके आधार पर एन्कोडिंग का उपयोग किया जाता है। तर्क के रूप में, अपने मामले के लिए आपकी रुचि के अनुसार जो भी सेट करें, उसका उपयोग करें getBytes()। और यह मानने के चक्कर में न पड़ें कि UTF-8 हर चरित्र को एक बाइट के रूप में दर्शाता है , क्योंकि यह सच भी नहीं है:
final String interesting = "\uF93D\uF936\uF949\uF942"; // Chinese ideograms
// Check length, in characters
System.out.println(interesting.length()); // prints "4"
// Check encoded sizes
final byte[] utf8Bytes = interesting.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "12"
final byte[] utf16Bytes= interesting.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "10"
final byte[] utf32Bytes = interesting.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "16"
final byte[] isoBytes = interesting.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "4" (probably encoded "????")
final byte[] winBytes = interesting.getBytes("CP1252");
System.out.println(winBytes.length); // prints "4" (probably encoded "????")
(ध्यान दें कि यदि आप वर्ण सेट तर्क प्रदान नहीं करते हैं, तो प्लेटफ़ॉर्म का डिफ़ॉल्ट वर्ण सेट उपयोग किया जाता है। यह कुछ संदर्भों में उपयोगी हो सकता है, लेकिन सामान्य रूप से आपको चूक के आधार पर बचना चाहिए, और एन्कोडिंग / जब हमेशा स्पष्ट वर्ण सेट का उपयोग करें डिकोडिंग की आवश्यकता है।)
getBytes()इसका उपयोग करते हैं तो यह आपके सिस्टम के डिफ़ॉल्ट चरित्र एन्कोडिंग का उपयोग करेगा।
यदि आप 64-बिट संदर्भों के साथ चल रहे हैं:
sizeof(string) =
8 + // object header used by the VM
8 + // 64-bit reference to char array (value)
8 + string.length() * 2 + // character array itself (object header + 16-bit chars)
4 + // offset integer
4 + // count integer
4 + // cached hash code
दूसरे शब्दों में:
sizeof(string) = 36 + string.length() * 2
32-बिट VM या 64-बिट VM पर संपीड़ित OOPs (-XX: + UseCompressedOops) के साथ, संदर्भ 4 बाइट्स हैं। तो कुल होगा:
sizeof(string) = 32 + string.length() * 2
यह स्ट्रिंग ऑब्जेक्ट के संदर्भों को ध्यान में नहीं रखता है।
sizeofसे अधिक होना चाहिए
पांडित्य का उत्तर (हालांकि जरूरी नहीं कि सबसे उपयोगी एक हो, जो इस बात पर निर्भर करता है कि आप परिणाम के साथ क्या करना चाहते हैं):
string.length() * 2
जावा स्ट्रिंग्स को UTF-16BEएन्कोडिंग में भौतिक रूप से संग्रहीत किया जाता है , जो प्रति कोड यूनिट 2 बाइट्स का उपयोग करता है, और String.length()UTF-16 कोड इकाइयों में लंबाई को मापता है, इसलिए यह इसके बराबर है:
final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);
और यह आपको बाइट्सchar में आंतरिक सरणी का आकार बताएगा ।
नोट: पूर्व एन्कोडिंग BOM सम्मिलित करने "UTF-16"से भिन्न परिणाम "UTF-16BE"देगा , सरणी की लंबाई में 2 बाइट जोड़ देगा ।
जावा में UTF8 बाइट सरणियों से स्ट्रिंग्स को कैसे और कैसे परिवर्तित करें :
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
s.getBytes(Charset.forName("UTF-8")):।
एक Stringउदाहरण मेमोरी में एक निश्चित मात्रा में बाइट्स आवंटित करता है। हो सकता है कि आप कुछ ऐसा देख रहे हों, sizeof("Hello World")जो डेटास्ट्रक्चर द्वारा आवंटित बाइट्स की संख्या को वापस कर देगा?
जावा में, आमतौर पर किसी sizeofफ़ंक्शन की आवश्यकता नहीं होती है , क्योंकि हम डेटा संरचना को संग्रहीत करने के लिए मेमोरी आवंटित नहीं करते हैं। हम String.javaएक मोटे अनुमान के लिए फ़ाइल पर एक नज़र डाल सकते हैं , और हम कुछ 'इंट', कुछ संदर्भ और ए देखते हैं char[]। जावा भाषा विनिर्देश परिभाषित करता है, एक है कि char0 से 65535 तक का पर्वतमाला है, तो दो बाइट्स स्मृति में एक भी चार रखने के लिए पर्याप्त हैं। लेकिन एक जेवीएम को 2 बाइट्स में एक चार को स्टोर करने की आवश्यकता नहीं है, यह केवल गारंटी देने के लिए है, कि कार्यान्वयन charडिफाइन रेंज के मूल्यों को पकड़ सकता है।
तो sizeofवास्तव में जावा में कोई मतलब नहीं है। लेकिन, यह मानते हुए कि हमारे पास एक बड़ी स्ट्रिंग है और एक charदो बाइट्स आवंटित करता है, तो किसी Stringऑब्जेक्ट की मेमोरी फ़ुटप्रिंट कम से कम 2 * str.length()बाइट्स में है।
वहाँ एक विधि getBytes () कहा जाता है । समझदारी से इस्तेमाल करो ।