String

String.java を見てみる。String は value(char配列), offset(valueの開始ポイントでint), count(文字数でint)を保持する。これらは final なので変更できない。基本的に、new したときにoffsetは0でvalueのchar配列に突っ込む。興味深いのは、substringしたときは、効率をあげるため、元のStringのvalueを利用して、offset で調整する(ということは、でっかい文字列をsubstringして、そのStringをセッションに突っ込んでおくと、でっかい文字列が保持されるのだろうか・・・)。この処理は、substring内でプライベートなコンストラクタを呼んでやっている(他にも呼ぶ場合があるのかもしれないけど、そこまで見てない)。

Integer

Integer.java を見てみる。Integerは、value(int)を単純にラップしているっぽい。このvalueはfinalだから変更できない(どおりで++とかないわけね)。前にも見たことがあるのだけど、-128~127のIntegerが必要ならvalueOfを使うと、キャッシュのIntegerを使ってくれる。1.5から導入されている “bit twiddling” メソッドあたりとか、こまごまとしたメソッドがあるので、社内勉強会で説明してもらおうっと。