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


262

私は読んでいたソフトウェアの詳細ジョエルを私が出会ったとき、ジョエル・スポルスキの違いを知るプログラマの特定の種類について何か言ってintIntegerのJava / C#での(オブジェクト指向プログラミング言語)。

それで、違いは何ですか?


4
C#には整数型はありません。
ユダガブリエルヒマンゴ

回答:


247

Javaでは、「int」型はプリミティブですが、「Integer」型はオブジェクトです。

C#では、「int」型は値型System.Int32と同じであり、値型です(つまり、Javaの「int」に似ています)。整数は(他の値型と同様に)オブジェクトにボックス化(「ラップ」)できます。


オブジェクトとプリミティブの違いはこの質問の範囲をやや超えていますが、要約すると:

オブジェクトは、ポリモーフィズムの機能を提供し、参照によって渡され(より正確には、値によって渡される参照を持ち)、ヒープから割り当てられます。逆に、プリミティブは値で渡される不変の型であり、多くの場合スタックから割り当てられます


61
「オブジェクト[...]は参照によって渡される」という文は混乱を招き、正しくありません、IMO。「オブジェクト参照は値で渡される」と言った方が正確です。(また、プリミティブは常にスタックから割り当てられるわけではありません-オブジェクト内のプリミティブフィールドを検討してください...)
Jon Skeet

5
少なくともC#では、intはInt32 CLR(実際にはCTS)タイプと同等の言語キーワードです。
スコットドーマン

6
申し訳ありませんが、英語では、「参照によって何かを渡す」と「値によって何かへの参照を渡す」という同等のステートメントは作成されません。また、プログラミング言語のコンテキストでは、これらは同等の意味を持ちません。
Alan Krueger

8
‒1。これはJavaがこれをどのように処理するかを正確に説明しているかもしれませんが、C#の場合は明らかに間違っています。
ジョーイ

8
なぜこれが投票されたのですか?答えは間違っています。これはJavaには完全に適切ではなく、C#にも適切ではありません。これを読んだ人は、以前よりもこのトピックについてあまり知らないでしょう。
トム・スミス

153

まあ、Javaでは整数はオブジェクトですが、整数はプリミティブです。新しい整数を作成した場合の意味:

Integer i = new Integer(6);

あなたは私にいくつかのメソッドを呼び出すことができます:

String s = i.toString();//sets s the string representation of i

一方、intの場合:

int i = 6;

これは単なるプリミティブであるため、メソッドを呼び出すことはできません。そう:

String s = i.toString();//will not work!!!

intはオブジェクトではないため、エラーが発生します。

intは、Javaの数少ないプリミティブの1つです(charやその他のプリミティブとともに)。私は100%確信はありませんが、Integerオブジェクトには多かれ少なかれintプロパティと、そのプロパティと対話するための一連のメソッド(たとえばtoString()メソッドなど)があるだけだと思います。したがって、Integerはintを操作するための洗練された方法です(おそらくStringがcharのグループを操作するための派手な方法であるように)。

JavaはCではないことは知っていますが、Cでプログラミングしたことがないので、これが最も近い答えです。お役に立てれば!

整数オブジェクトjavadoc

整数オブジェクトと整数プリミティブの比較


C#では、intはInt32の同義語です
。stackoverflow.com/ questions / 62503 / c

私はJavaを知りませんが、Integer型ではなくInt32、Int64があり、それらはすべて値型の構造体です。C#では、プリミティブとは、型がCLRチームによってFCL(フレームワーククラスライブラリ)で定義されていることを意味し、そのため、プリミティブと呼ばれています。この場合、Date objもプリミティブ型と呼ばれます。
Tarik、2012

37

上記の優れた答えに加えて、ボクシングとアンボクシング、およびこれがJavaにどのように適用されるかについて説明します(ただし、C#でも同様です)。私はJavaの用語だけを使用します。それは、私がそれをもっとよく知っているからです。

答えが述べたように、intは単なる数値(ボックス化されていないタイプと呼ばれIntegerます)ですが、オブジェクト(数値が含まれているため、ボックス化されたタイプです)です。Javaの用語では、これは(でメソッドを呼び出せないことを除いてint)、intコレクション(ListMapなど)。それらを格納するには、まず対応するボックス化されたタイプでボックス化する必要があります。

Java 5以降には、自動ボクシングおよび自動アンボクシングと呼ばれるものがあり、ボクシング/アンボクシングをバックグラウンドで実行できます。比較対照:Java 5バージョン:

Deque<Integer> queue;

void add(int n) {
    queue.add(n);
}

int remove() {
    return queue.remove();
}

Java 1.4以前(ジェネリックもなし):

Deque queue;

void add(int n) {
    queue.add(Integer.valueOf(n));
}

int remove() {
    return ((Integer) queue.remove()).intValue();
}

Java 5バージョンの簡潔さにもかかわらず、どちらのバージョンも同じバイトコードを生成することに注意する必要があります。したがって、自動ボクシングと自動アンボクシングはコードの記述が少ないため非常に便利ですが、これらの操作でバックグラウンドで同じランタイムコストで行われるため、それらの存在に注意する必要があります。

お役に立てれば!


2
DequeはJava 1.5または1.4にはありません。1.6で追加されました。
Leo Izen

28

他の投稿の一部はC#に関して少し不正確なので、ここに投稿します。

正しい:はの intエイリアスですSystem.Int32
誤り:はの floatエイリアスではありませんSystem.Floatが、System.Single

基本的に、intはC#プログラミング言語の予約キーワードであり、System.Int32値型のエイリアスです。

floatとFloatは同じではありませんが、 ''の適切なシステムタイプとしてfloat ''のはSystem.Singleである。このようないくつかのタイプには、タイプ名と直接一致しないように見える予約済みキーワードがあります。

C#では ' int' ''と ''の間に違いはありませんSystem.Int32では、列挙型を定義する場合を除いて、 ''、または他のペアまたはキーワード/システムタイプの。列挙型では、使用するストレージサイズを指定できます。この場合、システムランタイムタイプ名ではなく、予約済みキーワードのみを使用できます。

intの値がスタック、メモリ、または参照されるヒープオブジェクトとして格納されるかどうかは、コンテキストとその使用方法によって異なります。

メソッドでのこの宣言:

int i;

最適化に応じて、レジスタまたはスタックに存在するiタイプの変数を定義しますSystem.Int32。型(構造体またはクラス)の同じ宣言がメンバーフィールドを定義します。メソッド引数リストの同じ宣言は、ローカル変数の場合と同じ格納オプションを持つパラメーターを定義します。(イテレータメソッドをミックスに取り入れ始めると、この段落は無効になります。これらは完全に異なる獣です)

ヒープオブジェクトを取得するには、ボクシングを使用できます。

object o = i;

これiにより、ヒープ上の内容のボックス化されたコピーが作成されます。ILではヒープオブジェクトのメソッドに直接アクセスできますが、C#ではそれをintにキャストバックして、別のコピーを作成する必要があります。したがって、ヒープ上のオブジェクトは、新しいint値の新しいボックス化されたコピーを作成しないと、C#で簡単に変更できません。(ああ、この段落はそれほど簡単には読めません。)


19

Java 1.5とオートボクシングについてに関しては、Integerオブジェクトを比較するときに重要な「癖」があります。

Javaでは、値が-128から127のIntegerオブジェクトは不変です(つまり、1つの特定の整数値、たとえば23の場合、値23でプログラムを通じてインスタンス化されたすべてのIntegerオブジェクトは正確にポイントします同じオブジェクトをます)。

例:これはtrueを返します:

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); //  true

これはfalseを返しますが、

Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); //  false

==は参照によって比較します(変数は同じオブジェクトを指します)。

この結果は、使用しているJVMによって異なる場合と異なる場合があります。Java 1.5の仕様オートボクシングでは、整数(-128〜127)は常に同じラッパーオブジェクトにボックス化する必要があります。

解決策?=)Integerオブジェクトを比較するときは、常にInteger.equals()メソッドを使用する必要があります。

System.out.println(i1.equals(i2)); //  true

java.netの詳細情報bexhuff.comの


3
==と比較すると、new演算子で作成されたオブジェクトは常にfalseを返します。AndreasはInteger.valueOf(int)と新しいInteger(int)を混同しています
McDowell

1
注:デフォルト値127は次の場所からフェッチされますsun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
KNU

1
@andnil-私はStellentでBexを操作するために使用しています。彼はbexhuff.comの参照用に+1を引用するのに非常に優れたリソースです。
bcar


19

Javaでは、JVMに 2つの基本的なタイプがあります。1)プリミティブ型と2)参照型。intはプリミティブ型で、Integerはクラス型(参照型の一種)です。

プリミティブ値は、他のプリミティブ値と状態を共有しません。型がプリミティブ型である変数は、常にその型のプリミティブ値を保持します。

int aNumber = 4;
int anotherNum = aNumber;
aNumber += 6;
System.out.println(anotherNum); // Prints 4

オブジェクトは、動的に作成されたクラスインスタンスまたは配列です。参照値(多くの場合、参照のみ)は、これらのオブジェクトへのポインタと、オブジェクトを参照しない特別なnull参照です。同じオブジェクトへの参照が多数ある場合があります。

Integer aNumber = Integer.valueOf(4);
Integer anotherNumber = aNumber; // anotherNumber references the 
                                 // same object as aNumber

また、Javaではすべてが値で渡されます。オブジェクトの場合、渡される値はオブジェクトへの参照です。したがって、JavaのintとIntegerのもう1つの違いは、メソッド呼び出しでそれらを渡す方法です。たとえば

public int add(int a, int b) {
    return a + b;
}
final int two = 2;
int sum = add(1, two);

変数2は、プリミティブ整数型2として渡されます。

public int add(Integer a, Integer b) {
    return a.intValue() + b.intValue();
}
final Integer two = Integer.valueOf(2);
int sum = add(Integer.valueOf(1), two);

変数2は、整数値2を保持するオブジェクトへの参照として渡されます。


@WolfmanDragon:参照渡しは次のように機能します。

public void increment(int x) {
  x = x + 1;
}
int a = 1;
increment(a);
// a is now 2

incrementが呼び出されると、参照(ポインタ)が変数aに渡されます。そして、インクリメント関数は変数aを直接変更します。

オブジェクトタイプの場合、次のように機能します。

public void increment(Integer x) {
  x = Integer.valueOf(x.intValue() + 1);
}
Integer a = Integer.valueOf(1);
increment(a);
// a is now 2

違いがわかりますか?


あなたの定義では、参照渡しはありません。渡されたものは、ポインタの値である場合でも、値を持つ必要があります(nullでも値です)。それ以外の場合は、空のセットです。CS用語では、参照渡しは参照(ポインター)の値を渡します。私は少し混乱しています。
WolfmanDragon 2009年

11

C#では、intはのエイリアスSystem.Int32、stringはSystem.String、doubleはSystem.Double等...

個人的には、int、string、doubleなどがusing System;ステートメントを必要としないため、私は好みます:)ばかげた理由、私は知っています...


2
また、追加する必要があります。C#のint / Int32は、Javaの整数と同じではありません
ユダガブリエルヒマンゴ

10

ラッパークラスを使用する理由はたくさんあります。

  1. 追加の動作を取得します(たとえば、メソッドを使用できます)
  2. null値を格納できますが、プリミティブではできません
  3. コレクションは、プリミティブではなくオブジェクトの格納をサポートします。

8

これはすでにJava用に回答されています。C#の回答は次のとおりです。

「整数」はC#では有効な型名ではなく、「整数」はSystem.Int32の単なるエイリアスです。また、Java(またはC ++)とは異なり、C#には特別なプリミティブ型はありません。C#の型のすべてのインスタンス(intを含む)はオブジェクトです。ここにいくつかの実証的なコードがあります:

void DoStuff()
{
    System.Console.WriteLine( SomeMethod((int)5) );
    System.Console.WriteLine( GetTypeName<int>() );
}

string SomeMethod(object someParameter)
{
    return string.Format("Some text {0}", someParameter.ToString());
}

string GetTypeName<T>()
{
    return (typeof (T)).FullName;
}

2
明確にするために、C#では、intとSystem.Int32はオブジェクトではありません。これらは値型であり、CLRによるオブジェクトとの扱いは大きく異なります。
Peter Meyer、

4
実際、C#ではInt32はオブジェクトです。これは、system.objectから派生するvaluetype構造体オブジェクトです。「int」はJavaで使用されるため、他の値オブジェクトとは別に扱われません。
ウェッジ

8

intは、プリミティブ変数を宣言するために使用されます

e.g. int i=10;

Integerは、クラスIntegerの参照変数を作成するために使用されます

Integer a = new Integer();

8

Javaのようなプラットフォームでは、intsはプリミティブであり、Integerは、は整数フィールドを保持するオブジェクトです。重要な違いは、プリミティブは常に値によって渡され、定義により不変であることです。

プリミティブ変数を含む操作は、常に新しい値を返します。一方、オブジェクトは参照渡しされます。オブジェクトへのポイント(別名は参照)も値で渡されていると主張できますが、内容は渡されていません。


@peter Mortense、(int a; Integer a;)はプログラムにどのように影響しますか?つまり、実行中にどのように違いが生じるかを意味します。
Anuj Masand 2017

7

私が以前の回答で見たことのないもう1つのこと:Javaでは、Integer、Double、Float、Boolean ...、Stringなどのプリミティブラッパークラスは不変であると見なされているため、これらのクラスのインスタンスを渡すと、呼び出されたクラスのメソッドはデータを変更できませんでした。他のほとんどのクラスとは逆に、内部データはパブリックメソッドによって変更される可能性があります。そのため、このクラスには、コンストラクターのほかに「getter」メソッドのみがあり、「setter」はありません。

Javaプログラムでは、文字列リテラルはヒープメモリの別の部分に格納され、リテラルのインスタンスのみで、それらのインスタンスを再利用してメモリを節約します。


7

それまでにプログラミングしたことがありますか(int)は、変数に設定できるプリミティブ型の1つです(char、floatなど)。

ただし、Integerはラッパークラスであり、これを使用してint変数に対していくつかの機能を実行できます(たとえば、文字列に変換したり、その逆など)。ただし、ラッパークラスのメソッドは静的なので、使用できます。 Integerクラスのインスタンスを作成せずにいつでも。要約として:

int x;
Integer y; 

xとyはどちらもint型の変数ですが、yはIntegerクラスによってラップされており、使用するメソッドがいくつかありますが、Integerラッパークラスのいくつかの関数を呼び出す必要がある場合は、簡単に実行できます。

Integer.toString(x);

ただし、xとyの両方が正しいことに注意してください。ただし、これらをプリミティブ型としてのみ使用する場合は、単純な形式(xの定義に使用)を使用してください。


7

Java:

intdoublelongbytefloatdoubleshortbooleanchar-プリミティブ。言語がサポートする基本的なデータ型を保持するために使用されます。プリミティブ型はオブジェクト階層の一部ではなく、オブジェクトを継承しません。メソッドへの参照で渡すことはできません。

DoubleFloatLongIntegerShortByteCharacter、およびBoolean、で包装タイプのラッパーでありますjava.lang。すべての数値型ラッパーは、指定された値またはその値の文字列表現からオブジェクトを構築できるコンストラクターを定義します。オブジェクトを使用すると、最も単純な計算にもオーバーヘッドが追加される可能性があります。

JDK 5以降、Javaには、autoboxingとautounboxingの2つの非常に役立つ機能が含まれています。自動ボクシング/アンボクシングは、プリミティブ型をオブジェクトに、またはその逆に変換する必要があるコードを大幅に簡素化および合理化します。

コンストラクターの例:

Integer(int num)
Integer(String str) throws NumberFormatException
Double(double num)
Double(String str) throws NumberFormatException

ボックス化/ボックス化解除の例:

class ManualBoxing {
        public static void main(String args[]) {
        Integer objInt = new Integer(20);  // Manually box the value 20.
        int i = objInt.intValue();  // Manually unbox the value 20
        System.out.println(i + " " + iOb); // displays 20 20
    }
}

自動ボクシング/自動アンボクシングの例:

class AutoBoxing {
    public static void main(String args[]) {
        Integer objInt = 40; // autobox an int
        int i = objInt ; // auto-unbox
        System.out.println(i + " " + iOb); // displays 40 40
    }
}

PS Herbert Schildt氏の本は参考資料として取り上げられました。


4

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

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

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


4

JavaとC#のintおよびIntegerは、異なるものを表すために使用される2つの異なる用語です。これは、正確に格納できる変数に割り当てることができるプリミティブデータ型の1つです。一度に宣言された型の1つの値。

例えば:

int number = 7;

どこ int値7を保持する変数番号に割り当てられたデータ型はにありますか。つまり、intオブジェクトではなく単なるプリミティブです。

一方、Integer静的メソッドを持つプリミティブデータ型のラッパークラスです。これは、オブジェクトを必要とするメソッドの引数として使用できます。整数は、算術式に使用できる整数値を必要とするメソッドの引数として使用できます。

例えば:

Integer number = new Integer(5);

4

両方の言語(JavaおよびC#)intでは、4バイトの符号付き整数です。

Javaとは異なり、C#は符号付きと符号なしの両方の整数値を提供します。JavaとC#はオブジェクトオブジェクト指向であるため、これらの言語の一部の操作は、ランタイムによって提供される命令に直接マップされないため、何らかのタイプのオブジェクトの一部として定義する必要があります。

C#はSystem.Int32、ヒープの参照型に属するメモリの一部を使用する値型を提供します。

javaは、java.lang.Integerで動作する参照型intです。のメソッドInteger私たちは整数のインスタンスに変換し、いくつかのタイプのインスタンスを期待するメソッド(のように使用するint型の値をボックスinstructions.So缶がない時間を実行するために、直接コンパイルすることがtoString()parseInt()valueOf()など)。

C#では、変数intはSystem.Int32.Anyメモリ内の4バイトの値を参照し、プリミティブintとして解釈できます。これは、System.Int32。のインスタンスによって操作できます。したがって、intは、などの整数System.Int32.When関連のメソッドを使用するためのエイリアスです。整数は、 FCLは、のような、それぞれのメソッドを呼び出すストラクト、。int.Parse()int.ToString()System.Int32Int32.Parse()Int32.ToString()


4

Javaでは、int型はプリミティブデータ型であり、Integer型はオブジェクトです。

C#では、int型もと同じデータ型System.Int32です。integer(ちょうど他の値の型など)を対象に(「ラップ」)箱詰めすることができます。


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」はプリミティブデータ型であり、Javaのラッパークラスでは「整数」です。「整数」は、オブジェクトを必要とするメソッドへの引数として使用できます。「整数」は、算術式に使用できる整数値を必要とするメソッドへの引数として使用できます。


1

01.整数はnullにすることができます。ただし、intをnullにすることはできません。

Integer value1 = null; //OK

int value2 = null      //Error

02. Wrapper Classesタイプの値を任意のコレクションクラスにのみ渡すことができます。

(ラッパークラス-ブール、文字、バイト、短、整数、長、浮動、倍)

List<Integer> element = new ArrayList<>();
int valueInt = 10;
Integer  valueInteger = new Integer(value);
element.add(valueInteger);

しかし、通常、プリミティブ値をコレクションクラスに追加しますか?ポイント02は正しいですか?

List<Integer> element = new ArrayList<>();
element.add(5);

はい02は正しいです autoboxing.

オートボクシングは、Javaコンパイラがプリミティブ型と対応するラッパークラスの間で行う自動変換です。

次に、オートボクシングにより整数値として変換します。



0

(Javaバージョン)単純な言葉では、intはプリミティブで、Integerはintのラッパーオブジェクトです。

Integerとintを使用する1つの例、変数を再び比較してint変数にしたい場合、エラーがスローされます。

int a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is wrong - cannot compare primitive to null
{
do something...}

Instead you will use,
Integer a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is correct/legal
{ do something...}

0

あなたが学習している場合、私の知識によると、Javaでは、あなたがint aを書くとき; 次に、javaジェネリックでは、のようなコードをコンパイルしますInteger a = new Integer()。そのため、ジェネリックごとにInteger使用されていませんがint、使用されています。そこにそのような違いがあります。


この質問に対する他の18の回答があります。あなたは他の人が見逃したものを追加しますか?これがそもそも文法的でないことは助けにはなりません。
Teepeemm 2016


0

Intgerはオブジェクトですが、intはプリミティブデータ型です。Integerを使用してオブジェクトを作成すると、Integerクラスで使用可能なすべてのメソッドにアクセスできます。ただし、intを使用してプリミティブデータ型を作成すると、それらのinbuildメソッドを使用できなくなり、自分で定義する必要があります。ただし、他のメソッドが不要で、プログラムのメモリ効率を高めたい場合は、オブジェクトを作成するとメモリ消費量が増えるため、プリミティブデータ型を使用できます。

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