仕様流し読みんぐ
昨日JavaのSpecのドキュメント読んでたのだけど 3.10.5. String Literals の部分を見て、
それから Java文字列メモ(Hishidama's Java String Memo) を読んで
#buf_java Stringにinternってメソッドあるんかー。面白いー。 http://t.co/2nplUbEi19
— バファラティ (@bufferings) January 6, 2014
ってたらうらろふが
@bufferings internといえば(・∀・)つ http://t.co/1FUkjr7EFa
— うらがみ (@backpaper0) January 6, 2014
っていうもんだからきしださんのとこ読んで
なるほどなぁ。(回答編見ながら / “Javaパズル:”test”.length()の呼び出しで挙動が変わるのはナゼ? - きしだのはてな” http://t.co/kVulNpEVnR
— バファラティ (@bufferings) January 6, 2014
てことで面白かったー。なのだけど。
ついでにもういっこ記事を見つけたのでメモ。
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だよ
だってー。面白いねー。