きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

数字のキャッシュ

Java6 update14からIntegerのキャッシュが調整出来るようになってることに気付いてるかい?
いちおう、-128〜127が標準で、システムプロパティで、正の上限を増やせるようになってる。


数値は色々あるので、キャッシュについて軽くまとめてみよう。


Byteは-128〜127まで。(全部じゃね?)
Characterは0〜127まで。(文字であり数字)
Shortは-128〜127まで。
Integerは-128〜127が標準で、上限を拡大可能。
Longは-128〜127まで。
Floatはキャッシュなし。
Doubleはキャッシュなし。
BigIntegerは-16〜16まで。
BigDecimalはスケール0の0〜10と、0のスケール0〜スケール15まで。


Integerのキャッシュ上限拡大は、Sun以外の
JREには入ってない可能性が高い。少なくともIBM JDK 6.0 SR5にはなかったはず。
だからと言って、Integerのキャッシュがそこまで重要だと僕は考えてるわけじゃない。


BigDecimalは精度やスケールを気にするプログラムで使われてるはずだ。割り算大事。たとえば365くらいはキャッシュしときたい。とは言っても、BigDecimalの概念の中に、時間に関するものが入るのは好ましくないので、自前でBigDecimalのキャッシュを管理するクラスでも作ってみようかと考えてみた。


時間に関するものだけでなく、1のスケール-16〜15とかはけっこう使われると思う。
スケール-16ってことは、京(けい)まで表せるはずだ。おや?でも、これはスケールの操作で表すと問題がありそうだな。
1E+3と1のスケール-3は同じだが、1000とは同じではない。前者は精度が1なんだが、後者は精度が4なので、情報量が異なる。10.0と100E-1なら同じってこと。
precisionとscaleの違いは大事だよ。
よし、それらを踏まえてスケール0の1〜京までキャッシュさせとくか。