JavaでStringがある場合x
、その文字列のバイト数を計算するにはどうすればよいですか?
JavaでStringがある場合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"
ご覧のとおり、単純な「ASCII」文字列でも、使用するエンコーディングに応じて、その表現のバイト数が異なる場合があります。の引数として、目的に合った文字セットを使用してくださいgetBytes()
。また、UTF-8がすべての文字を1バイトとして表すと仮定するという落とし穴に陥らないでください。
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
圧縮されたOOP(-XX:+ UseCompressedOops)を備えた32ビットVMまたは64ビットVMでは、参照は4バイトです。したがって、合計は次のようになります。
sizeof(string) = 32 + string.length() * 2
これは、文字列オブジェクトへの参照を考慮していません。
sizeof
8の倍数でなければなりません
考え抜かれた答え(結果をどのように処理するかによっては、必ずしも最も役立つとは限りません)は次のとおりです。
string.length() * 2
Java文字列は物理的にUTF-16BE
エンコードに格納され、コード単位あたり2バイトを使用しString.length()
、UTF-16コード単位で長さを測定するため、これは次と同等です。
final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);
これにより、内部char
配列のサイズ(バイト単位)がわかります。
注:"UTF-16"
異なる結果が得られます"UTF-16BE"
以前のエンコーディングが挿入されますよう BOMされ、配列の長さに2バイトが追加ます。
Javaで文字列を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")
データ構造自体によって割り当てられたバイト数を返すようなものを見ていますか?
Javaではsizeof
、データ構造を格納するためにメモリを割り当てることはないため、通常、関数は必要ありません。String.java
大まかな見積もりのためにファイルを見ることができ、いくつかの「int」、いくつかの参照、およびが表示されchar[]
ます。Java言語仕様のことを定義し、char
2つのバイトがメモリ内の単一の文字を保持するのに十分であるように、0から65535の範囲です。しかし、JVMは1バイトを2バイトで格納する必要はありません。それは、の実装がchar
定義された範囲の値を保持できることを保証するだけです。
したがってsizeof
、Javaではまったく意味がありません。ただし、大きな文字列があり、1 char
つが2バイトを割り当てると仮定すると、String
オブジェクトのメモリフットプリントは少なくとも2 * str.length()
バイト単位になります。
getBytes()というメソッドがあります。賢く使ってください。