はじめに
Stringはjava.lang.Stringクラスの不変オブジェクトで、ヒープ領域に保存されます。
** Stringオブジェクトの不変性については、こちらの記事をご覧ください。
【Java】不変オブジェクトのStringと可変オブジェクトのStringBuilder
Stringオブジェクトの作り方
- Stringリテラルを使用
- newキーワードを使用
String s1 = "hello";
String s3 = new String("hello");
Stringはヒープメモリに保存される
Javaのオブジェクトはヒープメモリに保存されるため、Stringも例外なくヒープメモリに保存されます。しかし、Stringオブジェクトの作成の仕方によって保存のされ方が異なります。
1. Stringリテラルを使用した場合
この方法で作成されたStringは、Stringコンスタントプール(String constant pool)に保存されます。Stringコンスタントプールとは、JVMによってStringが保存されるヒープ領域内の特別な場所です。
JVMはhelloというStringオブジェクトをStringコンスタントプールに保存します。
String s1 = "hello";
次に、helloという文字列が再び定義する。
String s2 = "hello";
JVMはStringコンスタントプールに同じhelloをもつStringオブジェクトが存在するか確認します。もし、存在する場合は新しいオブジェクトが作成されるのではなく、すでに存在するStringオブジェクトの参照(メモリアドレス)を変数s2に渡します。Stringの不変性により文字列が変更されないことが保証されているため、JVMは一つのhelloを使い回すことでメモリを節約します。
2. newキーワードを使用した場合
String s3 = new String("hello");
String s4 = new String("hello");
newキーワードを使用する場合は、JVMはStringプールに同じStringオブジェクトが存在していたとしても、新しいStringオブジェクトをヒープ領域内に作成します。