More Joel on Softwareを読んでいるときに、 Joel Spolskyが Java/C# (Object-Oriented Programming Languages)の anint
と anの違いを知っている特定のタイプのプログラマーについて何か言っているのに出くわしました。Integer
それで、違いは何ですか?
More Joel on Softwareを読んでいるときに、 Joel Spolskyが Java/C# (Object-Oriented Programming Languages)の anint
と anの違いを知っている特定のタイプのプログラマーについて何か言っているのに出くわしました。Integer
それで、違いは何ですか?
Java では、「int」型はプリミティブですが、「Integer」型はオブジェクトです。
C# では、「int」型は値型System.Int32
と同じです(つまり、Java の「int」に似ています)。整数は (他の値の型と同様に) オブジェクトにボックス化(「ラップ」) できます。
オブジェクトとプリミティブの違いは、この質問の範囲を超えていますが、要約すると:
オブジェクトはポリモーフィズムの機能を提供し、参照によって渡され (より正確には値によって渡された参照を持つ)、ヒープから割り当てられます。逆に、プリミティブは、値によって渡される不変の型であり、多くの場合、スタックから割り当てられます。
Java では int はプリミティブですが、Integer はオブジェクトです。つまり、新しい整数を作成した場合:
Integer i = new Integer(6);
iでいくつかのメソッドを呼び出すことができます:
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であるためです。タイプ名と直接一致していないように見える予約キーワードを持つこのようなタイプがいくつかあります。
int
C#では、列挙型を定義する場合を除いて、 ''''と'' System.Int32
''、または他のペアやキーワード/システムタイプの間に違いはありません。列挙型を使用すると、使用するストレージサイズを指定できます。この場合、使用できるのはreservedキーワードのみであり、システムランタイムタイプ名は使用できません。
intの値がスタックに格納されるか、メモリに格納されるか、または参照されるヒープオブジェクトとして格納されるかは、コンテキストとその使用方法によって異なります。
メソッド内のこの宣言:
int i;
最適化に応じて、レジスタまたはスタックに存在するi
タイプの変数を定義します。System.Int32
タイプ(構造体またはクラス)の同じ宣言は、メンバーフィールドを定義します。メソッド引数リストの同じ宣言は、ローカル変数の場合と同じストレージオプションを使用してパラメーターを定義します。(イテレータメソッドをミックスに取り入れ始めた場合、この段落は無効であることに注意してください。これらはまったく異なる獣です)
ヒープオブジェクトを取得するには、ボクシングを使用できます。
object o = i;
i
これにより、ヒープ上のコンテンツのボックス化されたコピーが作成されます。ILでは、ヒープオブジェクトのメソッドに直接アクセスできますが、C#では、それをintにキャストバックする必要があります。これにより、別のコピーが作成されます。したがって、ヒープ上のオブジェクトは、新しいint値の新しいボックス化されたコピーを作成せずにC#で簡単に変更することはできません。(うーん、この段落はそれほど簡単には読めません。)
Java 1.5とオートボクシングに関しては、整数オブジェクトを比較するときに発生する重要な「癖」があります。
Javaでは、値が-128〜127の整数オブジェクトは不変です(つまり、ある特定の整数値、たとえば23の場合、値23でプログラムを介してインスタンス化されたすべての整数オブジェクトはまったく同じオブジェクトを指します)。
たとえば、これは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)をご覧ください。
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);
変数twoは、プリミティブ整数型 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);
変数twoは、整数値 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 は、 、 string 、 doubleなどの単なるエイリアスです...System.Int32
System.String
System.Double
個人的には、ステートメントを必要としないので、int、string、double などを好みますusing System;
:) ばかげた理由、私は知っています...
ラッパー クラスを使用する理由は多数あります。
これはJavaですでに回答されていますが、C#の回答は次のとおりです。
「整数」はC#の有効な型名ではなく、「int」は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 の定義に使用) を使用してください。
ジャワ:
int
, double
, long
, byte
, float
, double
, short
, boolean
-char
プリミティブ。言語でサポートされている基本的なデータ型を保持するために使用されます。プリミティブ型はオブジェクト階層の一部ではなく、オブジェクトを継承しません。これらは、メソッドへの参照によって渡すことができます。
Double
、Float
、Long
、Integer
、Short
、Byte
、Character
およびBoolean
は、 にパッケージ化されたタイプのラッパーjava.lang
です。すべての数値型ラッパーは、指定された値またはその値の文字列表現からオブジェクトを構築できるようにするコンストラクターを定義します。オブジェクトを使用すると、最も単純な計算にもオーバーヘッドが追加される可能性があります。
JDK 5 以降、Java には 2 つの非常に便利な機能が含まれています: autoboxing と autounboxing です。オートボクシング/アンボクシングは、プリミティブ型をオブジェクトに、またはその逆に変換する必要があるコードを大幅に簡素化および合理化します。
コンストラクタの例:
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 の本を参考にしました。
Java と C# の int と Integer は、異なるものを表すために使用される 2 つの異なる用語です。これは、正確に格納できる変数に割り当てることができるプリミティブ データ型の 1 つです。一度に宣言された型の 1 つの値。
例えば:
int number = 7;
int
値 7 を保持する変数番号に割り当てられたデータ型はどこにありますか。したがって、 anint
はオブジェクトではなく単なるプリミティブです。
は、Integer
静的メソッドを持つプリミティブ データ型のラッパー クラスです。これは、オブジェクトを必要とするメソッドの引数として使用できます。int は、算術式に使用できる整数値を必要とするメソッドの引数として使用できます。
例えば:
Integer number = new Integer(5);
int 変数は、32 ビットの符号付き整数値を保持します。Integer (大文字の I) は、(クラス) 型 Integer のオブジェクトへの参照、または null への参照を保持します。
Java は 2 つの間で自動的にキャストします。Integer オブジェクトが int 演算子の引数として発生するか、int 変数に割り当てられるか、int 値が Integer 変数に割り当てられるたびに、Integer から int へ。このキャスティングは、ボクシング/アンボクシングと呼ばれます。
null を参照する整数変数が明示的または暗黙的にボックス化されていない場合、NullPointerException がスローされます。
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. 整数はヌルにすることができます。ただし、int を null にすることはできません。
Integer value1 = null; //OK
int value2 = null //Error
02. ラッパー クラス型の値のみを任意のコレクション クラスに渡すことができます。
(ラッパー クラス - Boolean、Character、Byte、Short、Integer、Long、Float、Double)
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 コンパイラが行う自動変換です。
次に、オートボクシングによって整数値として変換します。
int はプリミティブ データ型ですが、Integer はオブジェクトです。Integer でオブジェクトを作成すると、Integer クラスで使用できるすべてのメソッドにアクセスできます。ただし、int でプリミティブ データ型を作成すると、それらの inbuild メソッドを使用できなくなり、自分で定義する必要があります。ただし、他のメソッドが必要なく、プログラムのメモリ効率を高めたい場合は、オブジェクトを作成するとメモリ消費量が増加するため、プリミティブ データ型を使用できます。