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 *****