不変クラスのキャッシュ
Java5からInteger#valueOf(int)メソッドが増えました。
これの利点は、-127〜128については、内部でキャッシュされたものが返されるため、生成コストが低いということ。ということで、Integerが欲しい時は、new Integerではなく、必ずInteger.valueOfを使うようにしよう。不変クラスなので、同じインスタンスが返ってきてもなんら問題ないはず。
一応実験。もちろんtrueになります。
System.out.println(Integer.valueOf(1) == Integer.valueOf(1));
ただし、これはtrueにならないので注意が必要です。
System.out.println(Integer.valueOf("1") == Integer.valueOf("1"));
なんでやろーと思ったのですが、Integer#valueOf(String)は以前より存在し、もともとこれが呼ばれたときは内部でnew Integerして返すようになっていました。5.0からキャッシュしたものを返すようにすると、今までの仕様と変わってしまうから、触らなかったんでしょうね。
ちなみにオートボクシングはどうなっているか気になったので、次のコードを作成し、逆コンパイルしてみました。
int i = 0; new ArrayList<Integer>().add(i);
期待通り、Integer.valueOf(i)を使うようになっていました。
そのほかのBooleanなどもnew Boolean(boolean)する方法とBoolean#valueOf(boolean)が提供されていますが、基本、すべてvalueOfを使うと覚えていて問題ないはずです。