2011-08-01 7 views
1

jdk 1.6.0_24で同じint値を持つ2つの整数オブジェクトの比較に失敗していますか?整数の比較に関する問題

問題:

Integer x = 2; 
Integer y = 2; 

If(x != y){ 
//Control should not come here, but controls come here . In jdk 1.6.0_26 it is working. 
} 

は、以下のようにコードスニペットを変更し、その後正常に動作します。

Integer x = 2; 
Integer y = 2; 

If(x.intValue() != y.intValue()){ 
//works fine. 
} 

それはjdkバグですか?

ありがとうございます。 Bhupendra Kalakoti

+1

あなたは等しくしましたか?また、価値の平等対オブジェクトの平等をチェックアウト... –

答えて

1

Marioがすでに暗示しているように、ここではJVMの純粋な最適化に夢中になります。小さな整数(「小さな」はJVMのバージョンと設定に応じてファジーな定義である)はキャッシュされるので、(小さな数字が頻繁に使用されるという仮定の下で)常に作成する必要はありません。

JVMベンダーは、デフォルトでのが適用される最適化を変更しているため、バージョンを変更する際に違いが生じる理由が説明されています。

1

私はここで見つける最高とおかしな柱のひとつに:Strangest language feature

「Javaでのオートボクシングと整数キャッシュと楽しい」(約498票)の回答を確認してください。

0

Integerは、intがプリミティブであるオブジェクトです。オブジェクトを比較するには、.equalsメソッドを使用してください。 ==または!=は、ヒープ内の同じアドレスにあるかどうかチェックします。TRUEであるかどうかは、キャッシングJVMがこのような文字列およびオブジェクトに適用されるためです。

.intValue()これらのオブジェクトのプリミティブ値を比較しているので、比較はうまくいきます。

0

オブジェクトに==を使用すると、参照を比較している、つまり同じオブジェクトになっています。 しかし、プリミティブで==を使用すると、その値が比較されます。

あなたの場合、あなたは自動ボクシングされたオブジェクトを使用しています。 Integerの場合、Integer.valueOf()メソッドが呼び出され、-128から127の間の小さな値(デフォルトの最大値)がキャッシュされ、Java 5.0がリリースされた2004年以降に行われています。

ところで:あなたが持つ整数キャッシュのサイズを増やすことができ

  • -Djava.lang.Integer.IntegerCache.high =値
  • -XX:AutoBoxCacheMax =値
  • -XX:+ AggressiveOpts

http://www.javaspecialists.eu/archive/Issue191.html

0

私はこれを証明しなければならなかった - シーイングが、彼らはそう信じています言う:

public class test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     final Integer intValue2 = 2; 
     Integer intValue = Integer.valueOf("2"); 

     System.out.println("INFO: intValue2 = " + intValue2); 
     System.out.println("INFO: intValue = " + intValue); 
     if (intValue2 == intValue) 
      System.out.println("PASS: Values are equal"); 
     else 
      System.out.println("FAIL: Values are not equal"); 
    } 
} 

Java 1.6を使用します。0_7:

INFO: intValue2 = 2 
INFO: intValue = 2 
FAIL: Values are not equal 

のJava 1.6.0_18を使用した:Javaを使用し

INFO: intValue2 = 2 
INFO: intValue = 2 
PASS: Values are equal 

など123456789非 "小さな" 値を使用し、一方、これに関係なく、Javaバージョンの失敗します1.6.0_7:

のJava 1.6.0_18を使用して
INFO: intValue2 = 1234567890 
INFO: intValue = 1234567890 
FAIL: Values are not equal 

INFO: intValue2 = 1234567890 
INFO: intValue = 1234567890 
FAIL: Values are not equal