3

オラクルが提供するオンラインチュートリアルを行っていました。演習の 1 つに、次のような問題があります。


次のコードは、1 つの配列と 1 つの文字列オブジェクトを作成します。コードの実行後にそれらのオブジェクトへの参照がいくつ存在するか? いずれかのオブジェクトがガベージ コレクションの対象ですか?

...
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;
...

回答: 学生配列への参照が 1 つあり、その配列には文字列 Peter Smith への参照が 1 つあります。どちらのオブジェクトもガベージ コレクションの対象になりません。

( http://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html )


確かに最後の行は、studentName が GC の資格があることを意味しますか? 本当に混乱しています。これは、「null」の性質とオブジェクト参照を正しく理解していないことを意味すると思います。

4

3 に答える 3

10

に割り当てる前に、"Peter Smith" への 2 つの参照 (nullおよび)があります。が StudentName に割り当てられた後も、"Peter Smith" は引き続き参照されます。studentNamestudentNamestudents[0]nullstudents[0]

于 2013-02-07T17:07:26.620 に答える
1

このページでは、参照の基本的な Java の概念をよく説明しています (また、参照が本質的に単なるポインターである方法についても説明しています)。

http://javadude.com/articles/passbyvalue.htm

質問についてではありませんが、それは直接関連しています。オブジェクトは、Java ではポインター (参照) によって参照されます。それを理解することは大いに役立つはずです。

于 2013-05-14T10:26:00.227 に答える
1

実際、ガベージ コレクションができないオブジェクトは何ですか? "Peter Smith" と String[10] 配列。これらはオブジェクト自体であり、オブジェクトへの参照ではないことに注意してください! ガベージ コレクションを回避するには、参照が 1 つ存在するだけで十分です。

コードを読みながら冗長にするという精神的なトリックを使用します。「文字列オブジェクト」(文字列内の単語)または「文字列参照」(単語を指す変数)を意味する場合、「文字列」(あいまい)と言うのは簡単なので、このトリックはこの混乱を回避します。

私の精神的なトリックで疑似コードを書き直し、すべてをオブジェクトまたは参照としてラベル付けします。

1 String[] OBJECT student REFERENCE = new String[10] OBJECT;
2 String OBJECT studentName REFERENCE = "Peter Smith" OBJECT;
3 students[0] REFERENCE = studentName REFERENCE;
4 studentName REFERENCE = null;

3 行目では、String[0]_参照が「Peter Smith」オブジェクトを指していました。これで、studentName参照だけが null に設定されたことが明らかになりましたが、「Peter Smith」オブジェクトは引き続き存在し、配列はまだそれを指しています。したがって、オブジェクトが null になることはなく、1 つの参照だけが null になりました。

于 2013-05-08T12:55:04.427 に答える