জাভাতে, আমার কাছে স্ট্রিং থাকলে আমি 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()। এবং ধরে নেওয়ার ফাঁদে পড়বেন না যে ইউটিএফ -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 "????")
(মনে রাখবেন যে আপনি যদি কোনও অক্ষর সেট যুক্তি সরবরাহ না করেন তবে প্ল্যাটফর্মের ডিফল্ট অক্ষর সেটটি ব্যবহার করা হবে some এটি কিছু প্রেক্ষাপটে কার্যকর হতে পারে তবে সাধারণভাবে আপনার ডিফল্টের উপর নির্ভর করে এড়ানো উচিত এবং এনকোডিং করার সময় সর্বদা একটি স্পষ্ট অক্ষর সেট ব্যবহার করা উচিত / ডিকোডিং প্রয়োজনীয়)
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-বিট ভিএম বা সংক্ষিপ্ত ওওপিএস (-XX: + UseCompPressOops) সহ একটি 64-বিট ভিএম-এ, রেফারেন্সগুলি 4 বাইট। সুতরাং মোট হবে:
sizeof(string) = 32 + string.length() * 2
এটি স্ট্রিং অবজেক্টের রেফারেন্সগুলিকে বিবেচনা করে না।
sizeof8 এর একাধিক হওয়া উচিত
পেডেন্টিক উত্তর (যদিও আপনি ফলটি নিয়ে কী করতে চান তার উপর নির্ভর করে সর্বাধিক দরকারী একটি নয়) হ'ল:
string.length() * 2
জাভা স্ট্রিংগুলি শারীরিকভাবে UTF-16BEএনকোডিংয়ে সংরক্ষণ করা হয় , যা প্রতিটি কোড ইউনিটে 2 বাইট ব্যবহার String.length()করে এবং ইউটিএফ -16 কোড ইউনিটে দৈর্ঘ্য পরিমাপ করে, তাই এটি সমান:
final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);
এবং এটি আপনাকে অভ্যন্তরীণ charঅ্যারের আকার , বাইটে জানাবে ।
দ্রষ্টব্য: প্রাক্তন এনকোডিংটি একটি বিওএম sert োকানো হবে , অ্যারের দৈর্ঘ্যে 2 বাইট যুক্ত করে "UTF-16"একটি আলাদা ফলাফল "UTF-16BE"দেবে ।
জাভাতে ইউটিএফ 8 বাইট অ্যারে থেকে এবং স্ট্রিংগুলিকে কীভাবে রূপান্তর করা যায় সে অনুযায়ী :
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একটা মোটামুটি প্রাক্কলন জন্য ফাইল, এবং আমরা কিছু 'int- এ', কিছু রেফারেন্স এবং একটি দেখতে char[]। জাভা ল্যাঙ্গুএজ স্পেসিফিকেশন সংজ্ঞায়িত, একটি যে char0 থেকে 65535 রেঞ্জের, তাই দুই বাইট মেমরি একটি একক গৃহস্থালির কাজ রাখার যথেষ্ট। তবে একটি জেভিএমকে 2 বাইটে একটি চর সংরক্ষণ করতে হবে না, এটি কেবল গ্যারান্টি দিতে হবে, এটি বাস্তবায়নেরchar নির্ধারিত পরিসরের মান ধরে রাখতে পারে।
সুতরাং sizeofজাভা কোন সত্যিকার অর্থে না। তবে, ধরে নিই যে আমাদের একটি বড় স্ট্রিং রয়েছে এবং একটিতে charদুটি বাইট বরাদ্দ করা হয়, তবে কোনও Stringবস্তুর মেমরির পদচিহ্ন কমপক্ষে 2 * str.length()বাইটে থাকে।
গেটবাইটস () নামে একটি পদ্ধতি রয়েছে । এটি বুদ্ধিমানের সাথে ব্যবহার করুন।