Long vs Integer、long vs int、何をいつ使用するのですか?


135

APIがlongor Longまたはintor を使用しているのを見かけることがありますIntegerが、そのための決定がどのように行われるのか理解できません。

何を選択すればよいですか?

回答:


191

LongあるObject形態long、及びIntegerのオブジェクト形式ですint

long使用する64ビットint使用する32ビット、そうのみ±2億番号を保持することができる(-2 31 +2へ31 -1)。

あなたは使用する必要がありますlongint、あなたはから継承されたメソッドを利用するために必要がある場合を除きObject、などhashcodeJava.util.collectionsメソッドは通常、ボックス化(Object-wrapped)バージョンを使用します。これは、メソッドがany Objectで機能する必要があり、intまたはのようなプリミティブ型longがでないためObjectです。

もう1つの違いは、ということであるlongintされている値渡し、一方LongIntegerされている参照渡し値すべての非プリミティブJava型等、。つまり、Longor を変更することが可能である場合Integer(そうでない場合は、JNIコードを使用せずに不変です)、どちらかを使用する別の理由があります。

最後の違いは、LongまたはであるInteger可能性があるということnullです。


5
@Borealid、これは間違いです。Javaは常に値渡しです。Javaには参照渡しなどはありません。
ディエゴラモス

9
うん?では、Javaが参照を渡さないという考え方を見てみましょう。int [2]を指定して関数を呼び出し、関数内でその配列の最初の要素に保持されている値を変更すると、関数の呼び出し元はその変更を確認できますか?はい?それは、関数に渡されたものが配列の値ではなく、それらの値への参照だったからです。「値渡し」とは、実際のデータ自体が間接的にコピーされることを意味します。Javaが価値を渡していることを教えた人は誰でもあなたを不快に思いました。
Borealid

3
@Borealidは不正解です。配列への参照の新しいコピーが作成されたため、値が変更されています。そのため、関数を呼び出している誰もが変更を認識しますが、これは依然として値渡しです。参照渡しがJavaにあるとは信じられません。元の参照を関数に渡すことはありません。
ディエゴラモス

6
Javaが実際の動作とはまったく異なる動作をする理論上の世界では、オブジェクトまたは配列を関数に渡すと、完全に別のコピーが作成されます(関数内の変更が呼び出し元にまったく反映されませんでした)。言語を説明しますか?私たちが話していることは、Javaが実際に行っていることとはまったく異なります。
Borealid

2
@DiegoRamosは正しいです。Javaは常に値で渡されます。プリミティブでない場合の値はメモリ参照であり、静的スワッピングはJavaでは機能しないため、混乱が生じます。詳細については、こちらをご覧ください。journaldev.com
3884

28

プリミティブ型ではできないことがいくつかあります。

  • 持っているnull値を
  • それらを同期する
  • それらをジェネリッククラスの型パラメーターとして使用し、それに関連します。
  • で動作するAPIに渡すObject

これらのいずれかが必要でない限り、必要なメモリが少ないため、プリミティブ型を優先する必要があります。


24
  • デフォルトでは、int数値を保持するときにを使用します。
  • の範囲intが小さすぎる場合は、long
  • の範囲longが小さすぎる場合は、BigInteger
  • 数値をオブジェクトとして処理する必要がある場合(たとえば、それらをCollection、処理null、... に入れるとき)代わりにInteger/ Longを使用します

13

An intは32ビット整数です。a longは64ビット整数です。どちらを使用するかは、使用する数値の大きさによって異なります。

intおよびlongはプリミティブ型でありInteger、およびLongはオブジェクトです。プリミティブ型の方が効率的ですが、オブジェクトを使用する必要がある場合があります。あなたが整数のリストが必要な場合、たとえば、Javaのコレクションクラスオブジェクトを持つことができます唯一の仕事は、あなたがそれにする必要がありList<Integer>ます(たとえば、あなたが使用することはできません、intList直接)。


6

整数は符号付き32ビット整数型です

  • として表記 Int
  • サイズ= 32 bits (4byte)
  • 範囲の整数を保持できます -2,147,483,648 to 2,147,483,647
  • デフォルト値は0です


Longは符号付き64ビット整数型です

  • として表記 Long
  • サイズ= 64 bits (8byte)
  • 範囲の整数を保持できます -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • デフォルト値は0Lです


変数の使用法が32ビットの範囲内にある場合Intは、を使用し、そうでない場合はを使用しますlong。通常longは科学的な計算などに使用され、そのようなものにはかなりの精度が必要です。(例えば、piの値)。

どちらを選ぶかという例は、YouTubeの場合です。彼らは最初に、ビデオビューカウンターをint2,147,483,647回を超えるビューが人気のあるビデオに受信されたときにオーバーフローしたものとして定義しました。以来Intカウンタが、よりその範囲よりもより任意の値を格納することはできません、YouTubeは64ビット変数にカウンターを変更し、今9,223,372,036,854,775,807ビューにカウントアップすることができます。データを理解し、64ビット変数が32ビット変数の2倍のメモリを使用するように適合するタイプを選択します。


1

32ビットを超える可能性のある非常に長い数値を使用する場合は、longを使用して、奇妙な動作が発生しないようにすることができます。

Java 5以降では、インボックス機能とアウトボックス機能を使用して、intとIntegerをまったく同じように使用できます。それはあなたができることを意味します:

int myInt = new Integer(11);
Integer myInt2 = myInt;

ボクシングinとout(のための同じあなたは、追加、変換することなく、int型と整数を切り替えることができLongDoubleShortあまりにも)

あなたは使用することができint、すべての時間を、しかしInteger(のような整数で、いくつかの複雑な操作を行うためにあなたを助けることができるいくつかのヘルパーメソッドが含まれていますInteger.parseInt(String)


0

a)オブジェクトクラス「Long」とプリミティブ型「long」。(少なくともJavaでは)

b)プリミティブ型のメモリサイズには、異なる(不明確なものもあります)があります。

Java-すべてクリア:https : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • バイト、文字.. 1B .. 8b
  • short int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • long int .. 8B .. 64b

C ..ごちゃごちゃ:https : //en.wikipedia.org/wiki/C_data_types

  • 短い.. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • 長い.. .. 32b
  • long long .. 64b ..混乱した!:-/

これは、ロングと長いなどの違いについてです質問、答えていない
GreenAsJade

いいえ、それは明示的には答えません。プリミティブ型とデータ型オブジェクトの違い、実際には@GreenAsJadeを明確に述べていません。上の質問は特定の言語を述べていないためです。だから私は比較を提供しました-それで誰もが違いをチェックすることができます。(提供されたハードデータから)
Franta

質問はJavaを述べた。
GreenAsJade
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.