Java 如何声明i和j使其成为无限循环? while(i=j&&i!=j){}
如何声明i和j使其成为无限循环 //这是我遇到的面试问题 它在问i和j的声明是什么,让它永远是真的 我不能把I和j声明为数字类型。还有什么其他类型可以满足它?Java 如何声明i和j使其成为无限循环? while(i=j&&i!=j){},java,infinite-loop,Java,Infinite Loop,如何声明i和j使其成为无限循环 //这是我遇到的面试问题 它在问i和j的声明是什么,让它永远是真的 我不能把I和j声明为数字类型。还有什么其他类型可以满足它?Integer i=新整数(1000); while( i <= j && i >= j && i != j) {} 整数j=新整数(1000); System.out.println((i=j)+++(i!=j)); i和j将自动取消绑定到=的ints,但不适用于=i和j是不同的实例,但具有
Integer i=新整数(1000);
while( i <= j && i >= j && i != j) {}
整数j=新整数(1000);
System.out.println((i=j)+++(i!=j));
i
和j
将自动取消绑定到=
的ints,但不适用于=代码>i
和j
是不同的实例,但具有相同的int值。这就是为什么这三个比较结果都是正确的 对于给定的语句,“i”和“j”的任何相等值都将显示为true,例如:
Integer i=new Integer(1000);
Integer j=new Integer(1000);
System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j));
整数i=新整数(1);
整数j=新整数(1);
而(i=j&&i!=j){}
魔术是用运算符!如果是!=运算符编译器将操作数作为对象(包括它们的值),而在>=或的情况下(“在我的机器上”):
然而,这是行不通的:
Integer a = 128, b = 128;
自动装箱int
是调用Integer.valueOf(int)
的语法糖。此函数对-128到127(含)之间的值使用缓存。它可能会缓存其他值,但在我的情况下,它不会
因此,128的分配没有缓存命中;它使用每个自动装箱操作创建一个新的Integer
实例,并使用参考比较a!=b
是正确的。127的赋值有一个缓存命中,得到的Integer
对象实际上是缓存中的同一个实例。因此,参考比较a!=b
为假
我真正想指出的是,要小心与自动装箱的引用比较。一个更可能的现实问题是,您期望A==b
为真,因为它们被分配了相同的(自动装箱)值,您运行一些单元测试来确认您的期望,然后当某个计数器超过缓存的上限时,您的代码“在野外”失败。快乐时光 @DJClayworth你所说的“|
版本”是什么意思?@Alan,很好的问题+1很好,我认为这是正确的答案。至少这是真的//这是一个多么棘手的面试问题+1i=j&&i!=j
+1以获得准确的答案,但为什么i和j不能为i解绑=J我不是=j应该检查i和j的值吗?还有哪些其他语言也是如此?@SpeedBirdNine不可能做到i=否则为空。有时候你想比较实例而不是值。问得好,回答得好+一个伟大的补充!
Integer a = 128, b = 128;
Integer a = 127, b = 127;