しらなかった

そんな仕様があったのか編。


String.intern();


しらねーよ、こんなメソッド。

何かってーとですね、Stringオブジェクトをカノニカル化してくれるらしい。
同じ文字列を表す異なったStringオブジェクトが山のように出てくるときに使うと効果的。メモリパフォーマンスが要求されたり、java.utilパッケージとか使ってて大量にgetだのcontainsだの使うときに使うとよいみたい。


いや何が驚きって、そんなのがVMの仕様にあったことなんだけどね。今まで全部自分で書いてただけに衝撃。


ちなみに、カノニカル化の書き方。忘れないようにメモ。


java.util.WeakHashMapを使う。

import java.util.Map;
import java.util.WeakHashMap;

public class Canonicalizer {

    public static  Canonicalizer create() {
        return new Canonicalizer();
    }

    private final Map cache = new WeakHashMap();

    private Canonicalizer() {
    }

    public E canonical(E obj) {
        if( obj == null ) return null;

        E result = cache.get(obj);
        if( result == null ) {
            result = obj;
            cache.put(result, result);
        }
        return result;
    }

}

いやまー、全部まとめてstaticにする方法もあるんだけどね。そうするとキャストが必要そう。あとequalsメソッドに依存する。ま、そのへんはしゃーないでしょ。うむ。