2017-01-26 9 views
1

これは、オブジェクトについてもう少し理解を深めるための良い練習になると思いました。元の参照変数を変更した後にJavaオブジェクトを再度参照する方法

オブジェクトの元の参照変数を変更した後でオブジェクトを再度参照する方法を理解しようとしています。

は、次のコードを取る:

String person = "person a"; //Line 1 
person = "person b";  //Line 2 

は今、1行目は、参照変数がpersonをされた新しいStringオブジェクトを作成します。 2行目はその参照変数を別の新しいStringオブジェクトに割り当てます。元のStringオブジェクトは参照変数を持たないようになりました。

すでに1行目のメモリにある元のStringオブジェクトをどのように戻して参照するのですか?例えば、リファレンス変数personを元のStringオブジェクトに割り当てて戻します。その後の考えとして、私はガベージコレクションについて多くのことを知っているわけではありませんが、ガベージコレクションの対象となる元のオブジェクトは、2行目以降も参照変数を持たないため、再度参照することはできません。

私はhashCode()メソッドを参照していますが、System.identityHashCode()も表示されていますが、元のオブジェクトを再度参照するためにすべてを実装する方法を理解できません。

+1

できません。以前の値を一時変数に格納し、それを介してアクセスします。 –

+2

'hashCode()'(および 'System.identityHashCode()')は特定のオブジェクトを取得するためのものではありません。その値をメモリアドレスとして解釈することはできません。ハッシュコードは、2つのオブジェクトが確実に等しくないかどうかを判断するためのものです。 –

+0

@AndyTurnerしたがって、2つのオブジェクトが同じ「ハッシュコード」を持つ場合、それらは同じメモリアドレスを持つとは言えませんか? –

答えて

3

行3:person = "person a"; Javaには、Stringインターンキャッシュがあります。さて、それがString(または他のキャッシュタイプ)でなかったなら、あなたは答えられません。承認されたオブジェクトはガベージコレクションの対象となっていたため(これ以上の参照はありません)。これを確認するには、

String person = "person a"; //Line 1 
System.out.println(person.hashCode()); 
person = "person b";  //Line 2 
person = "person a";  //Line 3 
System.out.println(person.hashCode()); 

同じhashCodeを2回表示します。それは同じインスタンスだからです。

+1

したがって、文字列が以前に作成されたStringオブジェクトと等しい場合、元のオブジェクトを使用しますが、ほとんどの他のオブジェクトでは、参照変数を持たないと再び使用できなくなります最初の場所)? – aCarella

+0

しかし、 "Aa"と "BB"は同じハッシュコードを持つことに注意することが重要です。しかし、彼らは別のオブジェクトです。 (そしてもちろん、 "Aa"と "新しい文字列(" Aa ")は同じハッシュコードを持ちますが、それらも異なるオブジェクトです)。ハッシュコードは、特定のオブジェクトを特定するために使用することはできません。 –

0

あなたは、新しいString

person = "person b"; 

最初の1が消滅.. を割り当てた後、あなたが彼の住所を失っているので、あなたがそれを使用することはできません。

関連する問題