计算机基础知识分享-6(Integer与int)

Integer与int的区别

  1. Integer 是 int 的包装类
  2. Integer 的初始值是 null, int 的初始值的 0;

Integer与int的相互转换

int => Integer

int i = 0;  
Integer wrapperi = new Integer(i); 

Integer => int

Integer wrapperi = new Integer(0);  
int i = wrapperi.intValue(); 

//JDK1.5以后的Integer转int 
Integer wrapperi = new Integer(0);  
int i = wrapperi;  

Integer.valueOf(int i) 方法

/*   
  * 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则   
  * 通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过   
  * 缓存经常请求的值而显著提高空间和时间性能。    
  * @param  i an <code>int</code> value.   
  * @return a <tt>Integer</tt> instance representing <tt>i</tt>.   
  * @since  1.5   
  */    
public static Integer valueOf(int i) {     
      final int offset = 128;     
      if (i >= -128 && i <= 127) { // must cache      
        return IntegerCache.cache[i + offset];     
     }     
     return new Integer(i);     
}    


跟踪IntegerCache这个类
/*   
  * IntegerCache内部类   
  * 其中cache[]数组用于存放从-128到127一共256个整数   
  */    
private static class IntegerCache {     
    private IntegerCache(){}     
    
    static final Integer cache[] = new Integer[-(-128) + 127 + 1];     
    
    static {     
        for(int i = 0; i < cache.length; i++)     
        cache[i] = new Integer(i - 128);     
    }     
}    

总结:

这就是valueOf方法真正的优化方法,当-128=<i<=127的时候,返回的是IntegerCache中的数组的值;当 i>127 或 i<-128 时,返回的是Integer类对象。

  1. 无论如何,Integer与new Integer不会相等。不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
  2. 两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
    java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
  3. 两个都是new出来的,都为false
  4. int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容