while(i <= j && i >= j && i != j) {}
iとjを宣言して無限ループにする方法を教えてください。iとjを宣言して無限ループにする方法は?
//私が会ったのはインタビューの質問です。
これはiとjの宣言が何であるかを尋ねています。常に真実にしてください。
そして、数字の型としてiとjを宣言することでそれを行うことはできません。他のどのようなタイプがそれを満たすことができますか?
while(i <= j && i >= j && i != j) {}
iとjを宣言して無限ループにする方法を教えてください。iとjを宣言して無限ループにする方法は?
//私が会ったのはインタビューの質問です。
これはiとjの宣言が何であるかを尋ねています。常に真実にしてください。
そして、数字の型としてiとjを宣言することでそれを行うことはできません。他のどのようなタイプがそれを満たすことができますか?
Integer i=new Integer(1000);
Integer j=new Integer(1000);
System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j));
i
とj
はなく!=
ため、<=
と>=
のためにint型に自動的にアンボクシングされます。 i
とj
は異なるインスタンスですが、同じint値を持ちます。 3つの比較がすべてtrueになる理由です。
良い、私はそれが正解だと思う。少なくともそれは真実を返している。 – Alan
ちょうど私にそれを打つ。 – DJClayworth
+1 'i <= j && i > = j && i!= j' [この場合はtrueと評価されます](http://ideone.com/G1xjn) –
「I」と「J」のいずれも等しい値が与えられた文で真明らかにする、と言う:
Integer i = new Integer(1);
Integer j = new Integer(1);
while(i <= j && i >= j && i != j) {}
魔法が使用演算子です! !=演算子の場合、コンパイラはオペランドをオブジェクト(値を含む)として取りますが、> =または< =の場合、コンパイラはオペランド値のみを取ります。したがって、上記のステートメントはtrueを返します。
これはあまりにも動作します( "私のマシン上で"):この一方
Integer a = 128, b = 128;
動作しません。
Integer a = 127, b = 127;
int
が
Integer.valueOf(int)
への呼び出しのための構文糖であるオートボクシング。この関数は、-128〜127の値にキャッシュを使用します。それは
かもしれません他の値をキャッシュしますが、私の場合はそうではありません。
したがって、128の割り当てにはキャッシュヒットはありません。各自動ボクシング操作で新しいInteger
インスタンスが作成され、参照の比較a != b
がtrueになります。 127の割り当てにはキャッシュヒットがあり、その結果のInteger
オブジェクトは実際にはキャッシュと同じインスタンスです。したがって、参照の比較a != b
はfalseです。
私が本当に指摘したいのは、自動ボクシングとの参照比較に注意することです。現実世界の問題は、同じ(自動ボックス化)値が割り当てられていること、予想を確認する単体テストを実行したこと、そしてコードが "野生のもの"で失敗していることが原因であると考えていることです。a == b
キャッシュの上限を超えています。楽しい時間!
+1 [バンタールの答え](http://stackoverflow.com/a/8015528/2932052)に大きな追加! – Wolf
ここで、i?.... – Kasturi
@DJClayworth "' || 'versionとはどういう意味ですか?" –
@アラン、非常に良い質問+1 – ELAYARAJA