これからJavaを学ぶ方やJavaの最新情報について学んでおきたい方が、最新バージョンであるJava SE 8の数値処理に関する拡張機能について知っておくべき点を紹介します。
数値のプリミティブデータ型
Javaを学ぶ方は最初にJavaプログラミングの基礎でプリミティブデータ型(primitive data type)を学びますよね。
どのデータ型もすべて符号付であり、C言語にあるような符号なしのデータ型はJavaにはありませんでした。
データ型 | 値 |
---|---|
byte | 8ビット 符号付整数 -128~127 |
short | 16ビット 符号付整数 -32,786~32767 |
int | 32ビット 符号付整数 -231~231 – 1 |
long | 64ビット 符号付整数 -263~263 – 1 |
このため、大きな整数値や高精度の数値を扱う場合は、BigIntegerやBigDecimalを使用することが推奨されてきました。
Java SE 8でのデータ型intとlongの拡張
Java SE 8では、プリミティブ・データ型のint型とlong型に拡張がなされています。その詳細がORACLEのサイトに掲載されていましたので以下にその一部を紹介します。
符号なし演算のサポート(Unsigned Arithmetic Support)
・parseUnsignedLong, toUnsignedString, divideUnsigned, compareUnsignedのようなstaticメソッドがLongクラスに追加された。また、divideUnsigned, compareUnsigned, parseUnsignedInt, remainderUnsigned, toUnsignedStringのようなstaticメソッドがIntegerクラスに追加された。.これらのメソッドは数値操作のためのBigDecimalやBigIntegerよりも高速です。
・参照URL:http://docs.oracle.com/javase/8/docs/technotes/guides/lang/enhancements.html
Variables→Primitive Data Typesに関する説明
•int型: Java SE 8とそれ以降において、符号なしの32ビット整数(最小値:0~最大値:232 – 1)を表現するてデータ型を使用することができる。符号なしの整数としてintデータ型をを使うために、Integerクラスを使用する。数値グラスを参照すれば、さらに情報がある。符号なし整数のための数値演算をサポートする Integerクラスが compareUnsigned、 divideUnsignedなどのstaticメソッドに追加さました
•long型:Java SE 8とそれ以降において、符号なしの64ビット整数(最小値:0~最大値:264 – 1)を表現するデータ型を使用することができます。 int型によって提供された値よりも幅広い値を必要とするとき、このデータ型が使える。Longクラスが、また、符号なし整数のための数値演算をサポートするcompareUnsigned、 divideUnsignedなどのstaticメソッドを含んでいます。
•参照URL:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
この説明の中で注目できるのは、「BigDecimalやBigIntegerよりも高速」という記述です。本当にそうなのか確かめたくなります。
BigDecimalやBigIntegerよりも高速か
確かめるために簡単な割り算プログラムを書いて、BigIntegerを使用した場合とJava SE 8で拡張されたIntegerクラスのdivideUnsigned()メソッドの計算速度を比較してみた。結果は、ORACLEの公表通り確かに早いのです。
実行結果:
BigInteger | 67ms | result:1000460 |
Integer | 10ms | result:1000460 |
実行環境: CPU Core i5 2.5Mhz,OS Windows10
測定に使用したプログラムのソースコード:
import java.math.BigInteger; class UnsignedIntegerTest { private final int MAX_LOOP_COUNT = 500000; public static void main(String[] args) { UnsignedIntegerTest test = new UnsignedIntegerTest(); test.testBigInteger(); test.testUnsignedInteger(); } void testBigInteger() { BigInteger x = new BigInteger("1234567890"); BigInteger y = new BigInteger("1234"); BigInteger result = new BigInteger("0"); long startTime = System.currentTimeMillis(); for (int counter = 0; counter < MAX_LOOP_COUNT; ++counter) { result = x.divide(y); } printResult(startTime); System.out.println("result:" + result.toString()); } void testUnsignedInteger() { int x = 1234567890; int y = 1234; int result = 0; long startTime = System.currentTimeMillis(); for (int counter = 0; counter < MAX_LOOP_COUNT; ++counter) { result = Integer.divideUnsigned(x, y); } printResult(startTime); System.out.println("result:" + Integer.toUnsignedLong(result)); } void printResult(long startTime) { long endTime = System.currentTimeMillis(); System.out.println((endTime - startTime) + "ms"); } }
まとめ
Javaの最新バージョンには、JavaFXのような大きな変更もあれば、見落としそうな拡張もあります。その見落としそうな拡張の中に、今回の「符号なしの整数のサポート」あります。しかも、高速です。ぜひ、活用してみてださい。
ページが見つかりません
指定されたURLのページは存在しません。
サイト更新などによってURLが変更になったか、URLが正しく入力されていない可能性があります。
ブラウザの再読込を行ってもこのページが表示される場合は、サイトマップまたはサイト内検索でお求めのページをお探しください。