これをJavaで書くと:
String s = "abc";
s はメモリ内で 3 バイトしか占有しませんか?
true の場合、JVM は String オブジェクトの末尾をどのように見つけますか?
これはメモリ内でより多くのバイトを必要としますか?
これをJavaで書くと:
String s = "abc";
s はメモリ内で 3 バイトしか占有しませんか?
true の場合、JVM は String オブジェクトの末尾をどのように見つけますか?
これはメモリ内でより多くのバイトを必要としますか?
3 バイト以上かかります。詳細については、このページを参照してください。
以下で説明する理由により、(Hotspot Java 6 VM 内の) Java 文字列の最小メモリ使用量は、一般的に次のとおりです。
Minimum String memory usage (bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)
または、別の言い方をすれば:
- String の文字数を 2 倍します。
- 38 を追加します。
- 結果が 8 の倍数でない場合は、次の 8 の倍数に切り上げます。
- 結果は通常、文字列によってヒープで使用される最小バイト数です。
同じ Web サイトのこのページでは、異なるクラスを使用してメモリを節約する方法についても詳しく説明しています。String
簡単な答え:いいえ、ロングショットではありません。JVM文字列は、非常に重いことでよく知られています。オブジェクトには、文字配列へのポインタだけでなく、その長さも含まれています。また、内部ストレージはUTF-16コードポイントを使用しているため、「6バイトかかるか」という質問があった可能性があります。:-)
JVMのテクニカルリファレンスでは、文字列オブジェクトの正確なサイズがわかります。また、このブログや技術記事などの興味深いブログ投稿もあります。
文字列オブジェクトの正確なサイズの問題には、さらに多くのことがあります。substring
オブジェクトポインタの圧縮、文字列のインターンなどに取り掛かることができます。文字列は不変であるため、たとえば呼び出したときに発生するように、文字列メモリを共有することがよくあります。
ただし、常に正しいのは、3バイトを超えることです。
最小文字列メモリ使用量 (バイト) = 8 * (int) ((((文字数) * 2) + 45) / 8)