2011-11-04 10 views
23
while(i <= j && i >= j && i != j) {} 

iとjを宣言して無限ループにする方法を教えてください。iとjを宣言して無限ループにする方法は?

//私が会ったのはインタビューの質問です。

これはiとjの宣言が何であるかを尋ねています。常に真実にしてください。

そして、数字の型としてiとjを宣言することでそれを行うことはできません。他のどのようなタイプがそれを満たすことができますか?

+0

ここで、i?.... – Kasturi

+0

@DJClayworth "' || 'versionとはどういう意味ですか?" –

+0

@アラン、非常に良い質問+1 – ELAYARAJA

答えて

38
Integer i=new Integer(1000); 
Integer j=new Integer(1000); 

System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j)); 

ijはなく!=ため、<=>=のためにint型に自動的にアンボクシングされます。 ijは異なるインスタンスですが、同じint値を持ちます。 3つの比較がすべてtrueになる理由です。

+2

良い、私はそれが正解だと思う。少なくともそれは真実を返している。 – Alan

+0

ちょうど私にそれを打つ。 – DJClayworth

+1

+1 'i <= j && i > = j && i!= j' [この場合はtrueと評価されます](http://ideone.com/G1xjn) –

-2

「I」と「J」のいずれも等しい値が与えられた文で真明らかにする、と言う:

Integer i = new Integer(1); 
Integer j = new Integer(1); 

while(i <= j && i >= j && i != j) {} 

魔法が使用演算子です! !=演算子の場合、コンパイラはオペランドをオブジェクト(値を含む)として取りますが、> =または< =の場合、コンパイラはオペランド値のみを取ります。したがって、上記のステートメントはtrueを返します。

3

これはあまりにも動作します( "私のマシン上で"):この一方

Integer a = 128, b = 128; 

動作しません。

Integer a = 127, b = 127; 

intInteger.valueOf(int)への呼び出しのための構文糖であるオートボクシング。この関数は、-128〜127の値にキャッシュを使用します。それは かもしれません他の値をキャッシュしますが、私の場合はそうではありません。

したがって、128の割り当てにはキャッシュヒットはありません。各自動ボクシング操作で新しいIntegerインスタンスが作成され、参照の比較a != bがtrueになります。 127の割り当てにはキャッシュヒットがあり、その結果のIntegerオブジェクトは実際にはキャッシュと同じインスタンスです。したがって、参照の比較a != bはfalseです。

私が本当に指摘したいのは、自動ボクシングとの参照比較に注意することです。現実世界の問題は、同じ(自動ボックス化)値が割り当てられていること、予想を確認する単体テストを実行したこと、そしてコードが "野生のもの"で失敗していることが原因であると考えていることです。a == bキャッシュの上限を超えています。楽しい時間!

+0

+1 [バンタールの答え](http://stackoverflow.com/a/8015528/2932052)に大きな追加! – Wolf

関連する問題