JavaのLongについて解説します

- システム
エンジニア - JavaのLongとはどのようなクラスなのでしょうか。
- プロジェクト
マネージャー - long型の数値を中に持つことが出来るクラスです。
JavaのLongとは?
JavaのLongクラスは、long型の数値を中に持つことが出来るクラスです。Longクラスについて解説する前に、long型について知っておきましょう。
long型は整数型で、64bitのサイズを持っています。具体的には-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの値を表せます。1800京以上の範囲の値を持つことが出来るのです。
long型を使う理由
「兆を超える京までの大きな数字を扱う必要があるの?intでいいのでは?」と思う人もいるかもしれません。よく使われるint型は32bitのサイズを持っていて、-2,147,483,648から2,147,483,647の範囲の値を表せます。しかし42億くらいでは不足するケースも多いのです。
例えば金融システムをJavaで作るなら、intの42億では全く足りません。日本の国家予算は毎年100兆円を超えます。そのようなことがあるので、longが必要になるのです。1800京以上ものサイズなら、どのようなケースでも不足することはまずないでしょう。
longとintの関係
Javaのlongとintを使う上で注意点があります。以下のようにintの値をlongの変数に入れようとするとエラーになります。
long longValue = 100;
int intValue = longValue;
この場合、以下のように(int)でキャストをすればエラーは出なくなります。
int intValue = (int)longValue;
ところが逆にintの値をlongの変数に入れる場合はキャストが無くてもエラーになりません。これはなぜでしょうか。
int intValue = 100;
long longValue = intValue;
long型の値にはlかLを付ける
実は以下のように記述した時点で、intからlongへの変換が行われています。
long longValue = 100;
Javaではただ100と記述した場合、int型になっています。以下のようにlまたはLを付けることでlong型の100になります。
long longValue = 100L;
それを踏まえて、以下のJavaサンプルを見てください。
long longValue = 3000000000L;
int intValue = (int)longValue;
System.out.println(intValue);
キャストを強制して注意を促す
上のJavaサンプルを実行すると、以下が表示されます。
-1294967296
30億をintValueに代入したのに、マイナス12億9千くらいになってしまいます。なぜでしょうか。これは桁あふれが起きてしまったのです。int型の正の数は2,147,483,647までなのに30億を代入したので、桁あふれしてマイナスに振れてしまったということです。
この様にサイズが小さい型の変数に代入する時は桁あふれの可能性があるので、Javaはキャストを強制して注意喚起しているということです。逆にint→longの場合は桁あふれの可能性が無いので、キャストをしなくてもエラーになりません。
Longクラスについて
Javaのlong型についてわかってきたところで、本題のLongクラスについて解説しましょう。Longクラスは最初にお話したように、long型の値を中に保持できるクラスです。以下のように宣言して利用します。
Long l = Long.valueOf(100);
System.out.println(l.longValue());
Long.valueOfメソッドで生成し、longValueメソッドで中の値を取得できます。以前は以下のようにnewで生成していたのですが、今は非推奨になっています。理由はvalueOfの場合はJavaの内部処理でLongインスタンスを再利用して、パフォーマンス効率を上げているからです。
Long l = new Long(100); // これは非推奨
Longクラスならnullにできる
「普通にlong型を使えばいいのに、なぜLongクラスというものがあるの?」と思う人もいるかもしれません。しかしLongクラスはlong型に比べて利点があるのです。まず一つは、nullの状態を持てるということです。
「nullの状態が必要ならlong型で0Lにしておけばいいのでは?」と思うかもしれませんが、0Lという数字にも意味はあります。nullのように「無い」という意味では使えません。Longクラスなら0Lにもnullにもできます。nullで、未初期化であるという状態が必要なケースは、Javaプログラミングにおいて意外と多いのです。
Long型はコレクションで利用できる
そのほかに、Long型はlong型と比べてインスタンスであることが利点です。それによって、以下のようにコレクションで利用できるのです。
import java.util.*;
public class MainClass {
public static void main(String[] args) {
List<Long> l = new ArrayList<>();
l.add(Long.valueOf(100L));
l.add(Long.valueOf(200L));
l.add(Long.valueOf(300L));
l.forEach(System.out::println);
}
}
Longクラスを使う利点
上のJavaサンプルを実行すると以下のように表示されます。
100
200
300
Listクラスの要素として、Addで追加するにはインスタンスでないといけません。long型の場合は配列がありますが、配列はList型のような豊富な機能はありません。例えばこのサンプルでは、forEachメソッドと::のメソッド参照で中身を全て表示するといったことをしていますが、配列にはそのような強力な機能はありません。
long型よりLongクラスを使う利点とはこのようなことです。必要な場合は是非Long型を利用しましょう。
Longクラスで最大値と最小値を得る
他のLongクラスの機能も紹介しましょう。まず以下のようにするとlong型の最大値と最小値を得られます。
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
結果は以下になります。
9223372036854775807
-9223372036854775808
long型は最大値と最小値がとても大きいので、使う機会は他の32ビット以下のクラスより多くなるでしょう。ちなみにint型はInteger.MAX_VALUEとInteger.MIN_VALUEで得られます。
long型と文字列の変換
Longでlong型の数値を文字列に変換できます。toHexStringでは16進数になります。
Long l = Long.valueOf(65535);
System.out.println(l.toString());
System.out.println(Long.toHexString(65535));
実行結果は
65535
ffff
です。逆に文字列からlong型にする場合は、以下のようにvalueOfで文字列を渡せば可能です。
Long l = Long.valueOf(“”65535″”);
- システム
エンジニア - Javaのlongについてよく理解することができました。
- プロジェクト
マネージャー - 32ビットのintだけでなく、long型とLongクラスも実際に使用してみましょう。
JavaのLongクラスを活用しよう
JavaのLongクラスについて解説しましたが、ご理解頂けましたでしょうか。32ビットのintでは、桁の不足が意外と多いと思いますが、そう言った時にlong型やLongクラスが役立つことでしょう。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)