私は読んでいたソフトウェアの詳細ジョエルを私が出会ったとき、ジョエル・スポルスキの違いを知るプログラマの特定の種類について何か言ってint
とInteger
のJava / C#での(オブジェクト指向プログラミング言語)。
それで、違いは何ですか?
私は読んでいたソフトウェアの詳細ジョエルを私が出会ったとき、ジョエル・スポルスキの違いを知るプログラマの特定の種類について何か言ってint
とInteger
のJava / C#での(オブジェクト指向プログラミング言語)。
それで、違いは何ですか?
回答:
Javaでは、「int」型はプリミティブですが、「Integer」型はオブジェクトです。
C#では、「int」型は値型System.Int32
と同じであり、値型です(つまり、Javaの「int」に似ています)。整数は(他の値型と同様に)オブジェクトにボックス化(「ラップ」)できます。
オブジェクトとプリミティブの違いはこの質問の範囲をやや超えていますが、要約すると:
オブジェクトは、ポリモーフィズムの機能を提供し、参照によって渡され(より正確には、値によって渡される参照を持ち)、ヒープから割り当てられます。逆に、プリミティブは値で渡される不変の型であり、多くの場合スタックから割り当てられます。
まあ、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でプログラミングしたことがないので、これが最も近い答えです。お役に立てれば!
上記の優れた答えに加えて、ボクシングとアンボクシング、およびこれがJavaにどのように適用されるかについて説明します(ただし、C#でも同様です)。私はJavaの用語だけを使用します。それは、私がそれをもっとよく知っているからです。
答えが述べたように、int
は単なる数値(ボックス化されていないタイプと呼ばれInteger
ます)ですが、オブジェクト(数値が含まれているため、ボックス化されたタイプです)です。Javaの用語では、これは(でメソッドを呼び出せないことを除いてint
)、int
コレクション(List
、Map
など)。それらを格納するには、まず対応するボックス化されたタイプでボックス化する必要があります。
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バージョンの簡潔さにもかかわらず、どちらのバージョンも同じバイトコードを生成することに注意する必要があります。したがって、自動ボクシングと自動アンボクシングはコードの記述が少ないため非常に便利ですが、これらの操作ではバックグラウンドで同じランタイムコストで行われるため、それらの存在に注意する必要があります。
お役に立てれば!
他の投稿の一部は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#で簡単に変更できません。(ああ、この段落はそれほど簡単には読めません。)
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
127
は次の場所からフェッチされますsun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
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
違いがわかりますか?
C#では、intはのエイリアスでSystem.Int32
、stringはSystem.String
、doubleはSystem.Double
等...
個人的には、int、string、doubleなどがusing System;
ステートメントを必要としないため、私は好みます:)ばかげた理由、私は知っています...
これはすでに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;
}
intは、プリミティブ変数を宣言するために使用されます
e.g. int i=10;
Integerは、クラスIntegerの参照変数を作成するために使用されます
Integer a = new Integer();
Javaのようなプラットフォームでは、int
sはプリミティブであり、Integer
は、は整数フィールドを保持するオブジェクトです。重要な違いは、プリミティブは常に値によって渡され、定義により不変であることです。
プリミティブ変数を含む操作は、常に新しい値を返します。一方、オブジェクトは参照渡しされます。オブジェクトへのポイント(別名は参照)も値で渡されていると主張できますが、内容は渡されていません。
私が以前の回答で見たことのないもう1つのこと:Javaでは、Integer、Double、Float、Boolean ...、Stringなどのプリミティブラッパークラスは不変であると見なされているため、これらのクラスのインスタンスを渡すと、呼び出されたクラスのメソッドはデータを変更できませんでした。他のほとんどのクラスとは逆に、内部データはパブリックメソッドによって変更される可能性があります。そのため、このクラスには、コンストラクターのほかに「getter」メソッドのみがあり、「setter」はありません。
Javaプログラムでは、文字列リテラルはヒープメモリの別の部分に格納され、リテラルのインスタンスのみで、それらのインスタンスを再利用してメモリを節約します。
それまでにプログラミングしたことがありますか(int)は、変数に設定できるプリミティブ型の1つです(char、floatなど)。
ただし、Integerはラッパークラスであり、これを使用してint変数に対していくつかの機能を実行できます(たとえば、文字列に変換したり、その逆など)。ただし、ラッパークラスのメソッドは静的なので、使用できます。 Integerクラスのインスタンスを作成せずにいつでも。要約として:
int x;
Integer y;
xとyはどちらもint型の変数ですが、yはIntegerクラスによってラップされており、使用するメソッドがいくつかありますが、Integerラッパークラスのいくつかの関数を呼び出す必要がある場合は、簡単に実行できます。
Integer.toString(x);
ただし、xとyの両方が正しいことに注意してください。ただし、これらをプリミティブ型としてのみ使用する場合は、単純な形式(xの定義に使用)を使用してください。
Java:
int
、double
、long
、byte
、float
、double
、short
、boolean
、char
-プリミティブ。言語がサポートする基本的なデータ型を保持するために使用されます。プリミティブ型はオブジェクト階層の一部ではなく、オブジェクトを継承しません。メソッドへの参照で渡すことはできません。
Double
、Float
、Long
、Integer
、Short
、Byte
、Character
、および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氏の本は参考資料として取り上げられました。
int変数は、32ビットの符号付き整数値を保持します。Integer(大文字のI)は、(クラス)タイプIntegerのオブジェクトまたはnullへの参照を保持します。
Javaは2つの間を自動的にキャストします。Integerオブジェクトがint演算子の引数として発生するか、int変数に割り当てられるか、またはint値がInteger変数に割り当てられるたびに、Integerからintへ。このキャストは、ボクシング/アンボクシングと呼ばれます。
nullを参照するInteger変数が明示的または暗黙的にボックス化されていない場合、NullPointerExceptionがスローされます。
JavaとC#のintおよびIntegerは、異なるものを表すために使用される2つの異なる用語です。これは、正確に格納できる変数に割り当てることができるプリミティブデータ型の1つです。一度に宣言された型の1つの値。
例えば:
int number = 7;
どこ int
値7を保持する変数番号に割り当てられたデータ型はにありますか。つまり、int
オブジェクトではなく単なるプリミティブです。
一方、Integer
静的メソッドを持つプリミティブデータ型のラッパークラスです。これは、オブジェクトを必要とするメソッドの引数として使用できます。整数は、算術式に使用できる整数値を必要とするメソッドの引数として使用できます。
例えば:
Integer number = new Integer(5);
両方の言語(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.Int32
Int32.Parse()
Int32.ToString()
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からの参照。
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コンパイラがプリミティブ型と対応するラッパークラスの間で行う自動変換です。
次に、オートボクシングにより整数値として変換します。
(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...}
あなたが学習している場合、私の知識によると、Javaでは、あなたがint aを書くとき; 次に、javaジェネリックでは、のようなコードをコンパイルしますInteger a = new Integer()
。そのため、ジェネリックごとにInteger
使用されていませんがint
、使用されています。そこにそのような違いがあります。
intはプリミティブデータ型です。 整数はラッパークラスです。intデータをオブジェクトとして保存できます。