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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

4751閲覧

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

mr0237

総合スコア164

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/06/08 09:07

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

java

1int 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[]」側は「スタック領域」側に確保されるのでしょうか?

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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/08 09:56

編集2017/06/12 22:36
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mr0237

2017/06/12 14:55

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

2017/06/12 14:58

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

2017/06/12 16:42

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

2017/06/12 22:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問