Java'da, bir Dize'im varsa x
, o dizedeki bayt sayısını nasıl hesaplayabilirim?
Java'da, bir Dize'im varsa x
, o dizedeki bayt sayısını nasıl hesaplayabilirim?
Yanıtlar:
Dize, karakterlerin listesidir (yani kod noktaları). Dizeyi temsil etmek için alınan bayt sayısı tamamen baytı dönüştürmek için hangi kodlamayı kullandığınıza bağlıdır .
Bununla birlikte, dizeyi bir bayt dizisine dönüştürebilir ve ardından boyutuna aşağıdaki gibi bakabilirsiniz:
// 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"
Gördüğünüz gibi, basit bir "ASCII" dizesi bile, hangi kodlamanın kullanıldığına bağlı olarak, temsilinde farklı sayıda bayt içerebilir. Davanız için ilgilendiğiniz karakter kümesini bağımsız değişken olarak kullanın getBytes()
. UTF-8'in her karakteri tek bir bayt olarak temsil ettiğini varsaymak tuzağına düşmeyin , çünkü bu da doğru değil:
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 "????")
(Bir karakter kümesi bağımsız değişkeni sağlamazsanız, platformun varsayılan karakter kümesinin kullanıldığını unutmayın. Bu, bazı bağlamlarda yararlı olabilir, ancak genel olarak varsayılanlara bağlı olarak kaçınmanız ve / kod çözme gereklidir.)
getBytes()
, sisteminizin varsayılan karakter kodlamasını kullanır.
64 bit referanslarla çalışıyorsanız:
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
Diğer bir deyişle:
sizeof(string) = 36 + string.length() * 2
32-bit VM veya sıkıştırılmış OOP'lara sahip bir 64-bit VM'de (-XX: + UseCompressedOops) başvurular 4 bayttır. Yani toplam:
sizeof(string) = 32 + string.length() * 2
Bu, string nesnesine yapılan referansları dikkate almaz.
sizeof
8. çoklu olmalıdır
Bilgiçliksel cevap (sonuçla ne yapmak istediğinize bağlı olarak mutlaka en yararlı olanı değildir):
string.length() * 2
Java dizeleri, UTF-16BE
kod birimi başına 2 bayt kullanan ve String.length()
UTF-16 kod birimlerindeki uzunluğu ölçen fiziksel olarak kodlamada saklanır , bu nedenle:
final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);
Bu size dahili char
dizinin boyutunu bayt cinsinden söyleyecektir .
Not: eski kodlamanın bir ürün ağacı ekleyeceği ve dizinin uzunluğuna 2 bayt eklediğinden "UTF-16"
farklı bir sonuç verecektir ."UTF-16BE"
Göre ve Java UTF8 bayt dizileri dizeleri dönüştürmek için nasıl :
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
s.getBytes(Charset.forName("UTF-8"))
.
Bir String
örnek, bellekte belirli bir bayt ayırır. Belki de sizeof("Hello World")
veri yapısı tarafından tahsis edilen bayt sayısını döndürecek bir şeye bakıyorsunuz ?
Java'da genellikle bir sizeof
işleve gerek yoktur , çünkü asla bir veri yapısını saklamak için bellek ayırmayız. String.java
Kaba bir tahmin için dosyaya bakabiliriz ve bazı 'int', bazı referanslar ve a char[]
. Java dili özellikleri tanımlar, bir o char
0 ile 65535 aralıkları, bu nedenle iki bayt belleğindeki tek kömürü tutmak için yeterlidir. Ancak bir JVM'nin bir karakteri 2 baytta saklaması gerekmez, sadece uygulamanın char
tanımlanan aralığın değerlerini tutabileceğini garanti etmesi gerekir .
Yani sizeof
Java'da gerçekten bir anlam ifade etmiyor. Ancak, büyük bir Dize ve bir tane char
iki bayt ayırdığımızı varsayarsak , bir String
nesnenin bellek ayak izi en azından 2 * str.length()
bayt cinsindendir.
GetBytes () adında bir yöntem var . Akıllıca kullanın .