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

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

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

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

Q&A

解決済

1回答

198閲覧

java参照型の基礎知識について

celsius710

総合スコア15

Java

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

0グッド

1クリップ

投稿2015/08/07 18:49

プログラミングの初心者であり、これから質問する内容が分かりづらいかもしれませんが、ご了承ください。
最近JAVAを勉強するようになり、データの種類として、プリミティブ型と参照型があることを知りました。
その中で参照型について、質問させてください。
例として今回はString型を上げさせていただきます。

String a ="abc";

上記のように設定すると、String型の変数aにabcという文字列が入力されている状態だと思います。
参照型は、直接値が設定されるわけではなく、参照するアドレスが設定されているということですが
参照するアドレスが設定されているというところがいまいちわかりづらく、実際にabcの文字列は
どこに格納されるのでしょうか。

また以下の処理の場合について質問させてください。

for(int i=0; i<3;i++){ Integer j =i; String a = j.toString(); System.out.println(a); }

上記の処理は、ループ変数を文字列aに格納しています。
プリミティブ型の場合は、値を上書きすると考えておりますが、上記のような参照型の場合は、ループするたびにaというString型のオブジェクトを生成し、値を格納していると思っております。
この場合、ループが2週目、3週目した場合は、依然の作成されたString型aはどうなるのでしょうか。
使われなくなるが、データとしては残ったままになるのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. 文字列"abc"はどこに保存されるの?

aの中では無い、メモリ上のどこかに保存されます。
JavaVMが管理しており、プログラムから直接見に行くことはできません。

文字列"abc"はString型のオブジェクトで、全てのオブジェクトは、
参照値というものが割り当てられます。(この参照値を直接知る方法はありません。)
文字列"abc"を生成して、その参照値aの中に入れろ、というのが
a = "abc"というコードの意味になります。
文字列"abc"と変数aは関連性はありますが、独立して存在すると言うことです。

  1. 毎回作った文字列はどこに行くの?

ループのたびに文字列を生成して、その参照値がaにはいるという解釈であっています。
では、前に生成した文字列はどうなるのかというと、実はしばらく残ったままです。
さきほど述べたように各文字列はaと独立して存在し、JavaVMによって管理されます。
なので、aと関連がなくなってもそのまま残ります。すぐには消えません。

では、そのうちメモリがいっぱいになるじゃ無いか?というとそうではありません。
重要なのは、すぐには消えず、しばらく残ることです。
JavaVMにはガベージコレクション(以下、GCと表記)という機能が備わっています。
このGCはなにかというと、使用しないオブジェクトを解放する機能です。
前のループで使った文字列はもう使われません。
唯一関連のあったaとは無関係になったので、使う方法がないといってもいいです。
GCは全てのオブジェクトについて現在使っているのかどうかを調べて、
もう、どこからも参照されていない、使用していないことがわかったオブジェクトの場合は、
解放(メモリ上から削除)していきます。
このGCはJavaVMが適切だと思うタイミングで自動的に行うので、
しばらく残るとなります。

上のGCは処理が重そうと思うかも知れませんが、実際重いです。
一昔前は、GCが走ったタイミングでプログラムが止まるとかありました。
ただ、最近はGCの仕組みに多くの工夫がして、高速になってきているので、
それほど気にする必要はありません。

投稿2015/08/07 21:43

raccy

総合スコア21735

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問