2016-05-01 5 views
0

は、私はこのコードを入力したインターネットで多くのことを探索してアンドロイドapplication.Soの開発にWeakReferenceを使用する方法を知りたい:WeakReferenceがオブジェクトの値を返すのはなぜですか?

{ 
     String kk = "Test"; 
     WeakReference<String> kkRef = new WeakReference<String>(kk); 
     System.out.println(kk); 
     System.out.println(kkRef.get()); 
     kk = null; 
     System.gc(); 
     System.out.println(kk); 
     System.out.println(kkRef.get()); 
    } 

GCに適格にkkオブジェクトを仮定し、しかし、コンソール出力で私がなぜそれがnullを返しませんでしについてweakReference

を読んでkkRef.get()はまだnullを返すことになって​​値を返すようですか?

答えて

2

まず、System.gc()は必ずしも完全ガベージコレクションを実行するとは限りません。したがって、同期して実行される保証はありません。したがって、すべての弱く保持されたオブジェクトを検出することは保証されていません。

第2に、コード内の文字列リテラルであるため、文字列は依然として強く保持されています。それは今までに収集されたガベージコレクションではありません。そのため、WeakReferenceは依然としてリテラルを返します。

+0

しかし、強い参照を削除する 'kk = null'を入力しました。 –

+0

@MohamedFadelBuffon:あなたは*その*強い参照を削除しました。文字列リテラルはコード内に存在します。 Javaでは、代入( 'String kk =" Test "')はオブジェクトのコピーを作成しません。文字列リテラルはガベージコレクションできません。 'new'キーワードを使って自分で作成したオブジェクトのインスタンスを使ってみてください。 – CommonsWare

+0

ありがとう、私のために働く:)。しかし、あなたは 'literal'が意味するものを私にexpalinしてもらえますか?ありがとうございます。 –

関連する問題