JavaのIntegerとintの違いは何ですか?


248

たとえば、なぜあなたはできるのですか?

int n = 9;

だがしかし:

Integer n = 9;

そしてあなたはできる:

Integer.parseInt("1");

だがしかし:

int.parseInt("1");

35
integerはクラス、intはプリミティブ型
Anycorn

24
あなたはできませんInteger n = 9;(あなたは、Javaの非常に古いバージョンを使用している場合を除く)によるオートボクシングに
Alderath

回答:


320

intプリミティブ型です。タイプの変数はint、表現したい整数の実際のバイナリ値を格納します。int.parseInt("1")ので、意味がありませんintはないクラス、したがって、任意のメソッドを持っていません。

Integerクラスであり、Java言語で他のどのクラスとも違いはありません。タイプの変数は、他の参照(オブジェクト)タイプと同様に、オブジェクトへの参照Integer格納します。クラスからの静的メソッドの呼び出しです(このメソッドは実際にはを返すのであり、を返すのではありません)。IntegerInteger.parseInt("1")parseIntIntegerintInteger

より具体的にIntegerは、はタイプの単一フィールドを持つクラスintです。このクラスはint、ジェネリック型やnullを可能にする必要がある状況など、他のオブジェクトと同様に処理する必要がある場合に使用されます。

Javaのすべてのプリミティブ型には同等のラッパークラスがあることに注意してください。

  • byte 持っている Byte
  • short 持っている Short
  • int 持っている Integer
  • long 持っている Long
  • boolean 持っている Boolean
  • char 持っている Character
  • float 持っている Float
  • double 持っている Double

ラッパークラスはObjectクラスから継承し、プリミティブは継承しません。そのため、オブジェクト参照またはジェネリックスを含むコレクションで使用できます。

Java 5以降はオートボクシングがあり、プリミティブクラスとラッパークラス間の変換は自動的に行われます。ただし、これにより微妙なバグやパフォーマンスの問題が発生する可能性があるので注意してください。変換について明確であることは決して害を及ぼしません。


6
ではC#、すべてのデータ型「エイリアス」と持っているint.Parse()メイクセンスを行います(それは本当にないにもかかわらず)
ヴァヒド・アミリ

22
@ VSG24 ...しかし、これはJavaの質問でした。これはJavaの答えです。C#ここではまったく関係ありません。
Darkhogg 2016年

3
良い例は次のとおりです:コンパイルエラー:List <int>有効:List <Integer>
hagai

追加の知識は常に利益をもたらす
sumit sharma

1
特に知識が現在のトピックに関連している場合は、新しいことを学ぶのが好きです。Vahidに感謝します。
ポールオリバー

30

整数はクラスであり、整数はプリミティブ型です。

これらのリンクを読んでください:


1
指摘したいのですが、これは2つの理由から完璧な答えだと思います。1-簡潔で正確、聴衆/質問者を念頭に置いてください2-回答のテキストにすべてを入れるのではなく、追加の詳細を指示する質問はこれに正確かつ簡潔に答えることができます(正確で完全なものになるには、より多くの詳細とニュアンスを必要とするものもあります)が、すべての答えは、この単純で直接的であるようにする必要があると思います。
DRich

11
ええ、私はそれは実際には反対だと思います。「intはプリミティブ型」は、プリミティブ型が何であるかがわからない場合は何も通知しません。(そして、もしそうなら、あなたはすでにintとIntegerの違いをすでに知っているでしょう)また、「リンク1」と「リンク2」というラベルの付いた2つのリンクに読者を送ることは、特に関連セクションを引用するだけの場合と比べると、まったく役に立ちません。
スティーブベネット

7

Integerは、プリミティブ型intの単なるラッパーです。これにより、Integerクラスのすべての関数を使用して、生活が少し楽になります。

Javaを初めて使用する場合は、Javaのドキュメントを参考にしてください。たとえば、整数クラスについて知りたいことはすべて詳細に文書化されています。

これは、Integerクラスのドキュメントには含まれていません。

Integerクラスは、プリミティブ型intの値をオブジェクトにラップします。Integer型のオブジェクトには、int型の単一のフィールドが含まれます。


7
これはやや要点を逃しています。たとえばInteger、クラスと同様に、(プリミティブ型とは異なり)コンテナに格納できます。
オリバーチャールズワース2011

6

int変数は、32ビットの符号付き整数値を保持します。Integer(大文字のI)は、(クラス)タイプIntegerのオブジェクトまたはnullへの参照を保持します。

Javaは2つの間を自動的にキャストします。Integerオブジェクトがint演算子の引数として発生するか、int変数に割り当てられるか、またはint値がInteger変数に割り当てられるたびに、Integerからintへ。このキャストは、ボクシング/アンボクシングと呼ばれます。

nullを参照するInteger変数が明示的または暗黙的にボックス化されていない場合、NullPointerExceptionがスローされます。

(上記のテキストでは、「変数」という用語はローカル変数、フィールド、またはパラメータを意味します)


5

Integerintプリミティブ型ですが、Javaのラッパー型を指します。Javaのプリミティブデータ型を除くすべてが、Javaを意味するオブジェクトが高度に修飾された純粋なオブジェクト指向プログラミング言語であるように実装されています。必要に応じて、すべてのプリミティブ型をJavaのラッパー型として使用することもできます。プリミティブ型を使用するとパフォーマンスが向上する可能性があるため、ラッパー型は必要な場合にのみ使用する必要があります。

あなたの例では以下のように。

Integer n = 9;

定数が9されている自動箱入りauto-boxingおよびunboxingから自動的に発生java 5以降)にInteger、したがって、あなたはまた、とのようなステートメントを使用することができますInteger n = new Integer(9)。これは実際にはステートメントを通じて達成されますInteger.valueOf(9).intValue();


3

intはプリミティブ型であり、オブジェクトではありません。つまり、それに関連付けられたメソッドはありません。Integerは、メソッド(parseIntなど)を持つオブジェクトです。

新しいJavaには、自動ボクシング(およびアンボクシング)の機能があります。つまり、コンパイラーは必要に応じてInteger.valueOf(int)またはinteger.intValue()を挿入します。それは実際に書くことが可能であることを意味します

Integer n = 9;

これは次のように解釈されます

Integer n = Integer.valueOf(9);

3

Integerはラッパークラス/オブジェクトで、intはプリミティブ型です。この違いは、コレクションにint値を格納する場合に大きな役割を果たします。これは、オブジェクトが値としてのみ受け入れられるためです(jdk1.4まで)。オートボクシングのため、JDK5以降はまったく別の話です。


5
JDK5 +もオブジェクトのみを受け入れます。それはオートボクシングは、コンパイラが自動的に呼び出すことができますだけということですInteger.valueOf(i)Integer.intValue()、あなたのために。Collection<int>それでも動作しません。だから、それはまったく異なる話ではありません-それは同じ話であり、ほんの少しの省略形です。
yshavit 2011

同意した。申し訳ありませんが、私の表現はそれを反映していない可能性があります。
kosa

3

Javaでは、intはプリミティブデータ型ですが、Integerはヘルパークラスです。これは、あるデータ型を別のデータ型に変換するために使用されます。

例えば:

         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

プリミティブデータ型は、ヘルパークラスが複雑な場合に利用可能な最速のメモリを格納し、ヒープメモリに格納します。

「David Gassner」Java Essential Trainingからの参照。


2

int整数を表すプリミティブ型です。一方Integer、ラップするオブジェクトですint。このIntegerオブジェクトは、16進数や文字列への変換など、より多くの機能を提供します。

でOOPの概念を使用することもできますInteger。たとえば、ジェネリック(つまり)にはIntegerを使用できます。Collection<Integer>


2

これは、Java:The Complete Reference、Ninth Editionからの引用です。

Javaはintdoubleなどのプリミティブ型(単純型とも呼ばれます)を使用して、言語でサポートされている基本的なデータ型を保持します。これらの量には、パフォーマンスのために、オブジェクトではなくプリミティブ型が使用されます。これらの値にオブジェクトを使用すると、最も単純な計算でさえ許容できないオーバーヘッドが追加されます。したがって、プリミティブ型はオブジェクト階層の一部ではなくObjectを継承しません

プリミティブ型が提供するパフォーマンス上の利点にもかかわらず、オブジェクト表現が必要になる場合があります。たとえば、メソッドへの参照によってプリミティブ型を渡すことはできません。また、Javaによって実装される標準のデータ構造の多くはオブジェクトで動作します。つまり、これらの(オブジェクト固有の)データ構造を使用してプリミティブ型を格納すること はできません。これらの(およびその他の)状況を処理するために、Javaはタイプラッパーを提供します。これは、オブジェクト内のプリミティブ型をカプセル化するクラスです。

ラッパークラスは、Javaのオートボクシング 機能に直接関連しています。タイプラッパーは、Double、Float、Long、Integer、Short、Byte、Character、およびBooleanです。これらのクラスは、プリミティブ型をJavaのオブジェクト階層に完全に統合できるさまざまなメソッドを提供します。


1

Javaコードの実行を最適化するには、int プリミティブ型は、(S)を含む追加されているfloatboolなどが、彼らはそこに一緒に来るラッパークラス必要な場合は、そのメンバーとして来て、多くのユーティリティと一緒に、標準のJavaオブジェクトとしてそれらを変換して使用することができますので、関数(などInteger.parseInt("1"))。


1

intはプリミティブデータ型Integerですが、Javaではリファレンスまたはラッパータイプ(クラス)です。

その後java 1.5オートボクシングアンボクシングの概念を導入し、両方を初期化するintInteger、このように初期化できます。

int a= 9
Integer a = 9 // both valid After Java 1.5.

なぜでもInteger.parseInt("1");ないのですint.parseInt("1");か?

Integerjdkライブラリで定義されたクラスでparseInt()あり、静的メソッドはIntegerクラスに属しています

したがって、Integer.parseInt("1");Javaで可能です。しかしint、Javaではプリミティブ型(キーワードのように想定)です。だから、あなたは呼び出すことはできませんparseInt()int

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