longとは?
Javaのlong型は、整数を格納するためのプリミティブ(基本)データ型です。Javaのプリミティブ整数型の中で、もっとも大きな範囲を扱うことができます。
具体的には、long型が扱える値の範囲は「−9,223,372,036,854,775,808」から「9,223,372,036,854,775,807」までで、約922京という膨大な数を表現できます。これはよく使われるint型(約21億まで)と比べると格段に大きな値です。
long型は64ビットのメモリ領域を使って値を保存します。それに対してint型は32ビットなので、long型はint型の2倍のメモリを使う分、より大きな数を扱えます。
long型が活躍するのは、ファイルのサイズ、経過時間(ミリ秒)、人口統計のような大きな整数値を扱う場面です。プログラムがint型の限界を超えた計算をしようとすると「オーバーフロー」と呼ばれる誤動作が起きますが、long型を使うことでその問題を回避できます。
Javaを学び始めたばかりの方にとって、最初はint型で十分なことも多いですが、数値の規模が大きくなる処理を書くときにはlong型の出番です。
基本構文
long型の変数を宣言するときは、型名として long を使います。また、long型のリテラル(直接書く数値)には、数値の末尾に L または l を付けます(大文字の L が推奨されます)。
L を付け忘れると、Javaはその数値をint型として解釈しようとするため、int型の範囲を超えた値ではコンパイルエラーが起きます。
変数宣言の基本
出力結果
世界人口: 8000000000long型の変数 population に、世界人口(約80億)を代入しています。この数値はint型の上限を超えているため、末尾に L を付けてlong型であることを明示しています。
int型からlong型へのキャスト
出力結果
long型に変換した値: 100000int型の変数をlong型に変換(キャスト)する例です。int型からlong型への変換は「拡大変換」と呼ばれ、値を失うことなく安全に変換できます。実際には (long) を省略しても自動的に変換されますが、ここでは明示的に (long) を付けています。
long型の最大値・最小値の確認
出力結果
long型の最大値: 9223372036854775807
long型の最小値: -9223372036854775808Long.MAX_VALUE と Long.MIN_VALUE は、Javaがあらかじめ定義しているlong型の上限・下限の定数です。これらを使うことで、コード中に手入力しなくても、long型が扱える範囲の上限・下限の値を簡単に参照できます。
実用例
ここでは、long型が実際のプログラムでどのように使われるかを、具体的なコードを通して説明します。日時の計算やループ処理、データのサイズ取得など、さまざまな場面でlong型が活躍します。各コード例を参考に、long型の使い方のイメージをつかんでください。
大きな整数の計算
大きな数値の足し算を行う例です。int型では表現できない数値も、long型なら正確に計算できます。
出力結果
アリ群全体の総数: 2700000000アリの群れの個体数をlong型で格納し、全体の合計を求めています。このような大きな数値をint型で扱おうとするとオーバーフローが起きる可能性がありますが、 long型はより大きな値を前提とした計算に適しています。
ループカウンターとしての使用
ループの回数がint型の上限を超える可能性がある場合、long型のカウンターを使います。
出力結果
ループ回数: 5for文のカウンター変数 i にlong型を使うことで、50億という大きな数値までループ処理を記述できます。int型では上限の約21億を超えてしまうため、long型が必要です。ここでは10億ずつ加算し、5回ループが回ることを確認しています。
ミリ秒単位の時間計測
プログラムの処理時間を計測するときに、long型はよく使われます。
出力結果(例)
処理時間(ミリ秒): 12System.currentTimeMillis() は現在時刻をミリ秒(1秒 = 1,000ミリ秒)単位で返すメソッドで、戻り値はlong型です。処理の前後でこの値を取得し、差し引くことで処理にかかった時間を計測できます。実行環境によって出力値は変わります。
掛け算によるオーバーフロー回避
int型どうしの掛け算では、結果がint型の範囲を超えるとオーバーフローが起きます。
出力結果
int型の結果: 1410065408
long型の結果: 1000000000010万 × 10万 = 100億という計算結果は、int型の上限を超えます。そのため、int型で計算すると誤った値が出力されます。一方、long型で計算すると正しく100億が得られます。掛け算のような積が大きくなる計算では、long型を積極的に使うことで誤動作を防げます。
Long型ラッパークラスの活用
long型(小文字)のプリミティブ型に対して、Long(大文字)というラッパークラスが存在します。
出力結果
文字列に変換: 9876543210
文字列から変換: 1234567890Long クラスは、long型の値をオブジェクトとして扱ったり、文字列との相互変換を行ったりするためのメソッドを提供しています。Long.parseLong() は文字列をlong型に変換するメソッドで、外部から読み込んだ数値データを扱うときによく使われます。
nullを扱うLong型の活用
Long型ラッパークラスは、数値をオブジェクトとして扱えるだけでなく、null を使って「未設定」の状態を表現できます。実務では、データベースの取得結果やフォーム入力など、「値が存在しない可能性がある」場面でよく利用されるテクニックです。
出力結果
会員IDは未設定です
会員ID: 1001 Long は long型(プリミティブ型)のラッパークラスです。プリミティブ型の long は null を扱えませんが、Long はオブジェクト型のため、未設定状態を表現可能です。また、Long.valueOf(文字や数値をLong オブジェクトに変換するメソッド) を使うことで、long型の値をLong オブジェクトへ変換できます。
複数の動物の体重合計の計算
long型は配列の要素型としても使用できます。以下は、複数の値を合算してlong型の変数に蓄積していく実用的なサンプルです。
出力結果
合計体重(グラム): 7530000複数の動物の体重(グラム単位)を配列に格納し、拡張for文を使って合計を求めています。この例では int 型でも問題ありませんが、配列要素が増えた場合を想定して、long型を選択しています。
まとめ
この記事では、Javaのlong型について基本的な概念から実際のコード例まで説明しました。long型はJavaの整数型の中でも格納できる範囲の広い型であり、大きな数値を扱う場面でなくてはならない存在です。
longの活躍する場面
- 人口・天文学的な数・金融データなど、大規模計算に必要
- 大容量ファイルの管理に使われる
- ミリ秒単位の処理時間計測で利用される
重要なポイント
- long型の数値リテラルには整数リテラルの末尾にはL をつける
- 大きな数値になる演算では、long型の使用を検討する
- 文字列変換やコレクションクラスでは、ラッパークラスLong も有効
long型を適切に使いこなすことで、Javaプログラムの信頼性と正確さが高まります。最初は「int型との使い分けが難しい」と感じるかもしれませんが、「大きな数を扱うときはlong型」という判断基準を持っておくだけでも十分です。
今回紹介したコード例を参考に、実際に手を動かしながらlong型の感覚を身につけていきましょう。