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

前端 未结 3 1166
北恋
北恋 2020-12-25 14:15
while( i <= j && i >= j && i != j) {}

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

// it\'s an interview q

相关标签:
3条回答
  • 2020-12-25 14:33

    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!

    0 讨论(0)
  • 2020-12-25 14:38
    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.

    0 讨论(0)
  • 2020-12-25 14:53

    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.

    0 讨论(0)
提交回复
热议问题