質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

配列のint a [] = new int[5]の「int a []」側はメモリ空間のどの領域に作成されるか?

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,057

score 162

頭があれで、説明が下手ですいませんが、Javaでの配列型変数 

int a[] = new int [5];


があったとして

new int [5];」側はメモリ空間ではJVM(JAVA)固有領域である「ヒープ領域」という領域にて確保されますが、「int a []」側はメモリ空間ではどの領域で確保されますか?

JVM(JAVA)のメモリには「JVM固有領域(ヒープ領域?)」と「OS固有領域」の2つがあると言われており、「OS固有領域」内にはさらに「Cピープ領域」と「スレッド領域」「スタック領域」等がありますが、このうちのどの領域に確保されますか?

又、配列変数の「int a []」は「int型やboolean型等」の「基本型変数」とメモリ上の番地を代入する変数「参照型変数」を足したようなものなんでしょうか?

つまり、配列変数の「int a [][]」は、基本型変数+参照型変数はこれら等で構成されているのでしょうか?

だとしたら、恐らく、「int a[]」側は「スタック領域」側に確保されるのでしょうか?

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

Javaのあらゆる参照型の「実体」は全てヒープ上に確保されます。スタック上(ローカル変数の中身を置く場所)には実体への参照だけが置かれています。

int a[]側

がローカル変数aのことであればそれはスタックということになります。

配列変数の「int a [][]」は、基本型変数+参照型変数はこれら等で構成されているのでしょうか

単に参照型の値を格納するための変数です。int a[][]の意味はint[][]型(それは参照型の一種)の変数aというだけの意味なのでString型などの普通の参照型変数と特に違いはありません。

ちなみにスタック領域、ヒープ領域の2種類だけを知っていればとりあえず充分な気がします。その2つをしっかり把握しておけばJavaプログラミング上の主な概念を理解するのに困ることはないと思います。(JNI、JITなどJVMの低水準な機構について知るという意味ではCヒープなども有効な知識だと思います)

(スレッド領域とスタック領域を別領域として書かれていますが、多分同じもののような気がします。記事によってはスレッドスタック領域と書かれていたりします。スタックはスレッド毎にあるのは当然という感覚なので自分は普段スレッドスタック領域とは呼ばず単にスタックという用語を使いますが・・・本当の用語はどちらなのでしょうね。)


追記:コメントへの回答ですがここに記します。

これは、配列変数(参照型変数)が「基本型変数」をベースに(配列変数が)設計されているのでしょうか?

そういってよいと思います。配列は「同じ型の要素が複数並んだような型」ですがそれを表すのに「要素を表す型T」と「配列を表す記号[]」をくっつけてT[]と表現する言語仕様になっているわけですね。int[]というような記法ではなくarrayOfIntという型の名前とするような言語仕様もあり得ると思いますが、そんなふうにしてしまうとint[][]arrayOfArrayOfIntint[][][]arrayOfArrayOfArrayOfIntなどとしなくてはならず、収拾がつかなくなることは想像に難くありません。そんな設計は「無限に型の名前を用意しなくてはならないことになってしまう」ため採用されず「要素の型」と「配列を表す記号」を並べて書くことで「配列の型を表現する」ようにするのが合理的ということが納得できるのではないでしょうか?

なお、基本型か参照型かについては「ある要素型Tの配列」「Tがプリミティブ型か参照型かには関係なく、常に参照型と決まっている」というのがJavaの規則です。

単なるintの値とint[]の値がスタック上どうなっているかを考えるとイメージしやすいと思います。

スタック         ヒープ
+------+
|   *------> +------------+----....----+ // 参照型(Stringの"abc")の実体はヒープ上にある
+------+     |class=String|'a','b','c' |
|  ... |     +------------+----....----+
+------+
|   *------> +------------+-----+-----+ // int[]の値の実体もヒープ上にある
+------+     |class=int[] |  1  |  2  | //   --->だから参照型になる
|  ... |     +------------+-----+-----+
+------+
|  1   | //上の配列の先頭要素を取り出して変数に入れれば要素の型はint(=プリミティブ型)なので
+------+ //このようにスタック上に値が直接入る


プリミティブ型の値は「スタック上に直接入っていてヒープを一切使わない」のに対して、参照型の値は「実体がヒープ上にあり、スタック上にはヒープを指すアドレスorハンドルのような参照値を使う」というイメージです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/12 23:55

    配列変数の「int a []」のint[]型は「参照型変数」、対してint型変数は「基本型変数」ですが、なぜ型の種類の名前「int」等が同じ名前になっているのでしょうか?
    これは、配列変数(参照型変数)が「基本型変数」をベースに(配列変数が)設計されているのでしょうか?

    キャンセル

  • 2017/06/12 23:58

    ↑つまり基本型変数「int a」と参照型変数「int[] a」←この2つの「int」という(型の)名前が同じなのはなぜなのか?ということです。 コメントの補足ですいません

    キャンセル

  • 2017/06/13 01:42

    配列もう一回勉強してきたほうがいいかと…

    キャンセル

  • 2017/06/13 07:13

    > つまり基本型変数「int a」と参照型変数「int[] a」←この2つの「int」という(型の)名前が同じなのはなぜなのか?

    回答へ追記しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る