しらなかった
そんな仕様があったのか編。
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メソッドに依存する。ま、そのへんはしゃーないでしょ。うむ。