3

oracledocsjava.langページでこれを読んでください。

多くの場合、プリミティブ型の値をオブジェクトであるかのように表す必要があります。ラッパークラス、、、、、、およびはこの目的を果たしBooleanます。CharacterIntegerLongFloatDouble

なぜこれらが必要なのか理解できません。のような便利な機能があると書いてありますequals()。しかし、私ができるのであれば、なぜ私はそれらをとして宣言し、より多くのメモリを使用して使用(a==b)したいと思うのでしょうか?2のメモリ使用量はどのように異なりますか?Integerequals()

4

3 に答える 3

10

Javaのジェネリックシステムは、クラスタイプのみをサポートします。また、プリミティブはクラスではないため、ジェネリックスでは使用できません。ただし、プリミティブのラッパークラスはジェネリック型として使用できます。たとえば、を宣言することはできませんが、ArrayList<int>を使用して同様の機能を実現できますArrayList<Integer>

変数の値をに初期化するのにも時々役立ちますnullnullただし、プリミティブを;に設定することはできません。その特権はオブジェクト用に予約されています。

// This is OK
Integer iDontKnowValueYet = null;

// Compile error!
int iDontKnowThisYetEither = null;
于 2012-09-01T03:16:26.213 に答える
1

int、char、doubleなどはすべてプリミティブであり、「new」を使用してインスタンス化する必要がないことを意味します。Integer、Character、Doubleのようなものは、コンピューター上でより多くのスペースを占めるオブジェクトです(オブジェクトのオーバーヘッドが多いため)が、Integer.parse()のようなメソッドを使用できます。一般に、プリミティブを使用し、メソッドの1つが必要な場合にのみオブジェクトバージョンを使用します。

a == b vs a.equals(b)についての質問に答えるには:

Integer a = new Integer(5);
Integer b = new Integer(5);

それらは同じ値ですが(これは.equalsがテストするものです)、「新しい」と2回言ったため、同じメモリではありません。a!= bがa.equals(b)

Integer a = new Integer(5);
Integer b = a;

これで、同じメモリを使用するようになりました。つまり、一方を変更すると、両方を変更します(「新規」を再度使用しない限り)。a == bおよびa.equals(b)

//using last code block
b = new Integer(5);

ここでも、a!= bですが、a.equals(b)== trueです。これも、同じ値ですが、メモリの異なる部分にあるためです。

于 2012-09-01T04:53:18.367 に答える
0

intは通常、データ構造に配置するときにラッパークラスにラップされます。したがって、.equalsメソッドは、データ構造で.containsメソッドを呼び出すタイミングを決定するために使用されます。

その他の便利なメソッド:toString toHexString parseString

于 2012-09-01T03:15:42.563 に答える