3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Java】Stringがどのようにメモリに保存されるのか調べてみた

Last updated at Posted at 2023-11-29

はじめに

Stringはjava.lang.Stringクラスの不変オブジェクトで、ヒープ領域に保存されます。

** Stringオブジェクトの不変性については、こちらの記事をご覧ください。
【Java】不変オブジェクトのStringと可変オブジェクトのStringBuilder

Stringオブジェクトの作り方

  1. Stringリテラルを使用
  2. 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オブジェクトをヒープ領域内に作成します。

図示してみる

スクリーンショット 2023-11-29 11.17.10.png

参考文献

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?