WeakHashMap

さりげない疑問なんだけど、
WeakHashMapのキーをStringでしているのって無駄じゃない?
という疑問についてですが・・・

どうよ?
""ってJavaVMで管理されるよね?
となると、参照が外れる事ってあるの?
(メモリ逼迫してきて、GCでどうにもならなくなってきたらあるのかな?)

というわけでこんな感じの駄目コード

public class Main {
 static WeakHashMap  
 public static void main(String[] args) {
  Object o = new Object();
  String b = "b";
  String createC = new String("c");
  
  map.put(b, "B");
  map.put(o, "A");
  map.put(createC, "C");
  print("1回目");
  
  System.gc();
  
  print("2回目");
  o = null;
  b = null;
  createC = null;
  System.gc();
  print("3回目");
  
 }
 
 static void print(String title) {
  System.out.println("****" + title + " start *****");
  for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) {
   Entry    System.out.println("key = " + element.getKey() + ", value = " + element.getValue());
  }
  System.out.println("****" + title + " end *****");
 }
}

結果

****1回目 start *****
key = c, value = C
key = java.lang.Object@3e25a5, value = A
key = b, value = B
****1回目 end *****
****2回目 start *****
key = c, value = C
key = java.lang.Object@3e25a5, value = A
key = b, value = B
****2回目 end *****
****3回目 start *****
key = b, value = B
****3回目 end *****


keyがObject oの時と、createCの時の動作は予想通りだけど、

ちなみにcreateC = new String("b");
とした場合、key"b"のエントリーは上書き
(Identiferではないため、equalsを利用しているため)

その場合、gc後にもエントリーは回収されません。
これって少し不思議なんですけど・・・

****1回目 start *****
key = java.lang.Object@3e25a5, value = A
key = b, value = C
****1回目 end *****
****2回目 start *****
key = java.lang.Object@3e25a5, value = A
key = b, value = C
****2回目 end *****
****3回目 start *****
key = b, value = C
****3回目 end *****