while( i <= j && i >= j && i != j) {}
how to declare i and j to make it be an infinite loop ?
// it's an interview question I met.
it's asking what's the declarations of i and j, make it be always true.
And I cant make it out by declaring i and j as number types. What other types can meet it ?
Integer i=new Integer(1000);
Integer j=new Integer(1000);
System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j));
i
and j
will be automatically unboxed to ints for <=
and >=
, but not for !=
. i
and j
are different instances, but have the same int value. That's why all three comparisons will return true.
This works too ("on my machine"):
Integer a = 128, b = 128;
whereas this won't work:
Integer a = 127, b = 127;
Auto-boxing an int
is syntactic sugar for a call to Integer.valueOf(int)
. This function uses a cache for values from -128 to 127, inclusive. It may cache other values, but in my case, it doesn't.
Thus, the assignment of 128 doesn't have a cache hit; it creates a new Integer
instance with each auto-boxing operation, and the reference comparison a != b
is true. The assignment of 127 has a cache hit, and the resulting Integer
objects are really the same instance from the cache. So, the reference comparison a != b
is false.
What I really want to point out is to beware of reference comparison with auto-boxing. A more likely real-world problem is that you expect a == b
is true because they were assigned the same (auto-boxed) value, you run some unit tests that confirm your expectation, and then your code fails "in the wild" when some counter exceeds the upper limit of the cache. Fun times!
Any equal value of 'i' and 'j' will reveal true with the given statement, say:
Integer i = new Integer(1);
Integer j = new Integer(1);
while( i <= j && i >= j && i != j) {}
The magic is with used operator! In case of != operator the compiler takes the operands as objects(including their values) whereas in case of >= or <= the compiler takes the operands value only. Thus, the above statement returns true.