2010年1月21日星期四

【转】【JavaBug】java的Integer比较

转自:http://jessdy.javaeye.com/blog/174011
首先:
Java代码
  1. public static void main(String []args) {  
  2.      Integer a = 100;  
  3.      Integer b = 100;  
  4.      System.out.println(a==b);   //true  
  5.    }  

Java代码
  1. public static void main(String []args) {  
  2.      Integer a = 200;  
  3.      Integer b = 200;  
  4.      System.out.println(a==b);   //false  
  5.    }  

原因:
1。java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2。比较的时候仍然是对象的比较
3。在jdk源码中
Java代码
  1. public static Integer valueOf(int i) {   
  2. final int offset = 128;   
  3. if (i >= -128 && i <= 127) { // must cache   
  4. return IntegerCache.cache[i + offset];   
  5. }   
  6. return new Integer(i);   
  7. }   


Java代码
  1. private static class IntegerCache {   
  2. private IntegerCache(){}   
  3. static final Integer cache[] = new Integer[-(-128) + 127 + 1];   
  4. static {   
  5. for(int i = 0; i < cache.length; i++)   
  6. cache = new Integer(i - 128);   
  7. }   
  8. }   

这边是java为了提高效率,初始化了-128--127之间的整数对象
所以在赋值在这个范围内都是同一个对象。
再加一句
Integer a = 100;
a++;
//这边a++是新创建了一个对象,不是以前的对象。
Java代码
  1. public static void main(String []args) {  
  2.     Integer a = 100;  
  3.     Integer b = a;  
  4.     a++;  
  5.     System.out.println(a==b);  
  6. }  

打印就是false
对于127--128没有多大关系,但是在这范围之外就影响性能了吧

没有评论: