私は初心者ですJavaコーダー、整数クラスの変数を読むだけでAPIで3つの異なる方法を説明できます。次のコードがあります。
_if (count.compareTo(0)) {
System.out.println(out_table);
count++;
}
_
これはループ内にあり、単に_out_table
_を出力します。
私の目標は、整数の値が_count > 0
_かどうかを確認する方法を理解することです。
count.compare(0)
が正しい方法であることに気付きましたか?またはそれはcount.equals(0)
ですか?
_count == 0
_が正しくないことは知っています。これは正解? _count=0
_だけの値比較演算子はありますか?
整数は自動ボックス化されていないので、
if (count > 0) {
....
}
Integer
が0より大きいかどうかを調べるには、次のことができます。
compareTo(O)
が正の数を返すかどうかを確認します。
_if (count.compareTo(0) > 0)
...
_
しかし、それはかなり愚かに見えますよね?より良いだけ...
オートボクシング を使用1:
_if (count > 0)
....
_
これは次と同等です:
_if (count.intValue() > 0)
...
_
"_==
_"は、Integer
オペランドがボックス化されているのではなく、ボックス化されていないint
オペランドでこのように評価されることに注意することが重要です。そうしないと、count
がnew Integer(0)
として初期化されたときに_count == 0
_がfalseを返します(「_==
_」が参照の等価性をテストするため)。
1技術的には、最初の例では autoboxing (Java 1.5の前にint
をcompareTo
に渡すことができませんでした)と2番目の例では nboxing を使用します。結合された機能は、単に略して「オートボクシング」と呼ばれることが多く、その後、両方のタイプの変換を「オートボクシング」と呼ぶように拡張されます。
2つの理由から、不必要なオートボクシングを避ける方が良いでしょう。
1つには、int < int
_よりも少し遅いです。これは、(場合によって)追加のオブジェクトを作成しているためです。
_void doSomethingWith(Integer integerObject){ ...
int i = 1000;
doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));
_
大きな問題は、隠されたオートボクシングが例外を隠すことができるということです:
_void doSomethingWith (Integer count){
if (count>0) // gets compiled into count.intValue()>0
_
null
でこのメソッドを呼び出すと、NullPointerException
がスローされます。
Javaでのプリミティブとラッパーオブジェクトの分割は、常に速度の手がかりとして説明されていました。オートボクシングはこれをほとんど隠しますが、完全ではありません。 Integerオブジェクトを取得した場合は、compare()
またはintValue()
を呼び出すことができます。プリミティブを取得した場合は、値を直接確認するだけです。
等号も使用できます。
Integer a = 0;
if (a.equals(0)) {
// a == 0
}
次と同等です:
if (a.intValue() == 0) {
// a == 0
}
また:
if (a == 0) {
}
(Javaコンパイラは自動的にintValue()を追加します))
オートボクシング/オートアンボクシングはかなりのオーバーヘッドをもたらす可能性があることに注意してください(特にループ内)。
確実にIntegerインスタンスでcompareTo
メソッドを使用できますが、コードを読み取るときは明確ではないため、おそらく使用しないでください。
Javaでは、オートボクシング( http://Java.Sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html を参照)を使用して、intと直接比較することができます。できる:
if (count > 0) { }
また、Integer
インスタンスcount
は、比較のためにint
に自動的に変換されます。
これを理解できない場合は、上記のリンクを確認するか、これを実行していると想像してください。
if (count.intValue() > 0) { }
もう1つ注意が必要なのは、2番目の値がリテラル「0」ではなく別の整数オブジェクトである場合、「==」演算子はオブジェクトポインターを比較し、自動ボックス化解除しないことです。
すなわち:
Integer a = new Integer(0);
Integer b = new Integer(0);
int c = 0;
boolean isSame_EqOperator = (a==b); //false!
boolean isSame_EqMethod = (a.equals(b)); //true
boolean isSame_EqAutoUnbox = ((a==c) && (a.equals(c)); //also true, because of auto-unbox
//Note: for initializing a and b, the Integer constructor
// is called explicitly to avoid integer object caching
// for the purpose of the example.
// Calling it explicitly ensures each integer is created
// as a separate object as intended.
// Edited in response to comment by @nolith