27

私は初心者の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ますか?

4

7 に答える 7

31

anIntegerが0より大きいかどうかを判断するには、次のことができます。

  • compareTo(O)正の数を返すかどうかを確認します。

    if (count.compareTo(0) > 0)
         ...
    

    しかし、それはかなりばかげているように見えますね?ただ...

  • オートボクシングを使用する1

    if (count > 0)
        ....
    

    これは次と同等です。

    if (count.intValue() > 0)
        ...
    

    ==「 」はこのように評価され、オペランドがボックス化されているIntegerのではなく、intオペランドがボックス化されていないことに注意することが重要です。それ以外の場合は、として初期化されcount == 0たときにfalseを返します( " "は参照の同等性をテストするため)。countnew Integer(0)==

1技術的には、最初の例では自動ボックス化を使用し(Java 1.5より前ではにを渡すことができませんでしintcompareTo)、2番目の例ではボックス化解除を使用しています。組み合わされた機能は、略して単に「オートボクシング」と呼ばれることが多く、その後、両方のタイプの変換を「オートボクシング」と呼ぶように拡張されることがよくあります。用語の使い方がおかしいことをお詫びします。

于 2009-06-04T21:24:34.027 に答える
27

整数は自動的にボックス化されないので、次のことができます

if (count > 0) {
    .... 
}
于 2009-06-04T21:25:52.840 に答える
13

2つの理由から、不要なオートボクシングは避けたほうがよいでしょう。

一つには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()を呼び出すだけで済み、プリミティブがある場合は、値を直接確認するだけです。

于 2009-06-04T21:42:04.493 に答える
13

equalsを使用することもできます。

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }

これは次と同等です:

 if (a.intValue() == 0) {
     // a == 0
 }

そしてまた:

 if (a == 0) {

 }

(Javaコンパイラは自動的にintValue()を追加します)

自動ボクシング/自動アンボクシングは、かなりのオーバーヘッド(特にループ内)を引き起こす可能性があることに注意してください。

于 2009-06-04T21:42:13.743 に答える
3

確かcompareToにIntegerインスタンスでメソッドを使用することはできますが、コードを読み取るときに明確ではないため、おそらくそうすることは避けてください。

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) { }
于 2009-06-04T21:28:32.833 に答える
1

もう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
于 2012-09-28T19:12:53.233 に答える
-1

まあ私はこれに遅れるかもしれませんが、私は何かを共有したいと思います:

入力が与えられた場合:System.out.println(isGreaterThanZero(-1));

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.compareTo(0) > 0;
}

falseを返します

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.intValue() > 0;
}

trueを返すので、あなたの場合は「compareTo」の方が正確だと思います。

于 2017-07-11T10:55:38.110 に答える