String.intern たぶん自分は使うことないだろうけど面白いなーメモ

仕様流し読みんぐ

昨日JavaのSpecのドキュメント読んでたのだけど 3.10.5. String Literals の部分を見て、
それから Java文字列メモ(Hishidama's Java String Memo) を読んで

ってたらうらろふが

っていうもんだからきしださんのとこ読んで

てことで面白かったー。なのだけど。
ついでにもういっこ記事を見つけたのでメモ。

string-intern-in-java-6-7-8

String.intern in Java 6, 7 and 8 - string pooling - Java Performance Tuning Guide

意訳ね。

そもそも。Stringクラスのinternメソッド使って何が嬉しいかって。
同じ文字列なら共通のStringオブジェクト使ってメモリ節約できるから(゚д゚)ウマー。
やね。

1/11追記-------------
共通のオブジェクトなので比較が == でできるのでパフォーマンスが良くなるというのも利点です。
比較が多いプログラムか、同一の文字列が多いプログラムかによってどちらの利点が効いてくるかって感じですかねー。
追記ココまで------------------------


  • んでも、Java6では実行時固定サイズのPermGenに保存されるから、OOMとか出てしまうし使わん方がよいよ。
  • Java7,8だとヒープに保存されてガーベッジコレクションの対象にもなるから使えるんちゃう?
  • 文字列を保存するためのプールは固定サイズのマップで、それぞれのバケットに文字列リストを保存してるんだけど
    • Java6はもう忘れるとして(ノД`)シクシク
    • Java7,8だと -XX:StringTableSize オプションでマップのサイズを指定できるから、使う予定のサイズに近い素数をマップのサイズに指定して、1つのバケットに1つの文字列が入るようにしといたらパフォーマンスがコンスタントになって良いよ
    • 自前でWeakHashMapでプールしてもよかろう?って思うかもだけど、internのが5倍くらいメモリ節約できるよ
    • -XX:StringTableSizeの初期値はJava7だと1009だけど、Java8だと25-50Kだよ

だってー。面白いねー。