String配列の文字列の要素charはメモリのどこにある?

わからないこと

最近諸事情でJavaの勉強を始めた者です(非情報系)、知識としては過去にC言語を講義でほんの少しだけ齧ったことのある程度です。

Javaにおける配列で疑問に思ったことがありますので質問させていただきます。

合っている自信がないのですが、内部的には下記のような状態になっていると現状は理解しています(間違っていたら指摘ください)

①配列を宣言した際、宣言した配列の変数には配列そのものではなくその配列の実体を示す参照値が格納され、その参照値はスタック領域に配置される。
②newでインスタンス生成した際に配列そのものがオブジェクトとしてヒープ領域に配置される。
③配列の要素の実体もヒープ領域にあり、配列の変数[番号] に定義(格納)された参照値を用いることで実体にアクセスすることができる。
④String型はクラスであり、こちらだけ特別に宣言の際に自動でヒープ領域にインスタンス(文字列リテラル)が生成され、宣言したString変数に参照値が格納される。
⑤String型の中身はchar型の文字要素で構成された配列オブジェクトであり、一つ一つの文字の実体はそれぞれヒープ領域に配置されている。

上記を踏まえまして、String型の配列を宣言した際の内部の状態が知りたいです。

例えば
String[] strings = {"あいうえお", "ABCDE", "一二三四五"};
で定義された配列があった場合、
stringsに格納されている参照先に"あいうえお"と"ABCDE"と"一二三四五"の3つの文字列リテラルの実体要素を持つオブジェクトがヒープ領域にあると今まで思っていました。

ですがString型文字列の中身がchar型の配列だということを考えると、String配列から見たchar型の文字要素は「配列の要素の中のさらに配列の要素」という位置付けになってしまいます。

この場合、ヒープ領域にある配列の要素を参照してまた更にどこかを参照する動きになるのでしょうか? もしそうならどこにそのような領域を確保しているのでしょうか? この場合のchar型文字は内部でどのような状態になっているのでしょうか?

上記のことをずっと考えては調べてを繰り返してしまい先に進めない状態です。
実はJavaの配列に入った際も配列宣言がなぜそのまま行えるのかが頭で納得できず何日か止まっていました(そして上の①〜③に辿り着きました)
今回も同じように止まってしまい参考書が終わらない予感がしたためこちらで質問させていただきました、本当なら「こういうものだ」と受け入れて先に進みたいのですが出来ない性分で、、、

拙い文章で申し訳ございませんが、お答えくださると嬉しいです。

コメントを投稿

0 コメント