Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to declare i and j to make it be an infinite loop?

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 ?

like image 842
Alan Avatar asked Nov 04 '11 20:11

Alan


2 Answers

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.

like image 123
Piotr Praszmo Avatar answered Oct 07 '22 08:10

Piotr Praszmo


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!

like image 3
erickson Avatar answered Oct 07 '22 08:10

erickson