how to declare i and j to make it be an infinite l

2019-02-01 20:17发布

问题:

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 ?

回答1:

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.



回答2:

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!



回答3:

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.