PHP笔记网

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2013-04-12 17:51:24  修改时间:2024-11-22 07:05:00  分类:07.Java基础  编辑

int和Integer区别以及应用

1、Java 提供两种不同的类型:引用类型和原始类型(或内置类型)

Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 

原始类型封装类 boolean/Boolean、char/Character、byte/Byte、short/Short、int/Integer、long/Long、float/Float、double/Double

引用类型和原始类型的行为完全不同,并且它们具有不同的语义。

引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。

对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

2、使用场合,例如说

往ArrayList里面add,必须add的是Object

而int不是对象,就只能把Integer添加进去

3、int是基本类型

Integer是int对应的封装类,

声明int a;  a自动赋值0;

声明Integer a; a自动赋值为null

4、int是基本的数据类型

integer是类

int的初始值为0,不能为null,如果需要为null的时候,需要用integer

 


Integer 是一个类,是int的扩展,定义了很多的转换方法

类似的还有:float Float、double Double、string String等 。

举个例子:当需要往ArrayListHashMap中放东西时,像intdouble这种内建类型是放不进去的,因为容器都是装object的,这是就需要这些内建类型的外覆类了。

Java中每种内建类型都有相应的外覆类。

 


Java中int和Integer关系是比较微妙的。关系如下:

1、int是基本的数据类型;

2、Integer是int的封装类;

3、int和Integer都可以表示某一个数值;

4、int和Integer不能够互用,因为他们两种不同的数据类型;

举例说明:

ArrayList al=new ArrayList();
int n=40;
Integer nI=new Integer(n);
al.add(n);//不可以
al.add(nI);//可以

 


 

昨天例行code review时大家有讨论到int和Integer的比较和使用。 这里做个整理,发表一下个人的看法。

【int和Integer的区别】

  • int是java提供的8种原始类型之一,java为每个原始类型提供了封装类,Integer是int的封装类。int默认值是0,而Integer默认值是null;
  • int和Integer(无论是否new)比较,都为true, 因为会把Integer自动拆箱为int再去比;
  • Integer是引用类型,用==比较两个对象,其实比较的是它们的内存地址,所以不同的Integer对象肯定是不同的;
  • 但是对于Integer i=*,java在编译时会将其解释成Integer i=Integer.valueOf(*);。但是,Integer类缓存了[-128,127]之间的整数, 所以对于Integer i1=127;与Integer i2=127; 来说,i1==i2,因为这二个对象指向同一个内存单元。 而Integer i1=128;与Integer i2=128; 来说,i1==i2为false。

【各自的应用场景】

  • Integer默认值是null,可以区分未赋值和值为0的情况。比如未参加考试的学生和考试成绩为0的学生
  • 加减乘除和比较运算较多,用int
  • 容器里推荐用Integer。 对于PO实体类,如果db里int型字段允许null,则属性应定义为Integer。————默认也应当定义为包装类型,从而兼容数据为null的情况,规避NPE异常。诸如mybatis这些代码生成器生成的属性就是包装类型,我们从阿里开发规范里也可以找到类似声明———— 当然,如果系统限定db里int字段不允许null值,则也可考虑将属性定义为int。
  • 对于应用程序里定义的枚举类型, 其值如果是整型,则最好定义为int,方便与相关的其他int值或Integer值的比较
  • Integer提供了一系列数据的成员和操作,如Integer.MAX_VALUE,Integer.valueOf(),Integer.compare(),compareTo(),不过一般用的比较少。建议,一般用int类型,这样一方面省去了拆装箱,另一方面也会规避数据比较时可能带来的bug。
  • ————————————————————————————————————————
  •  

【附:Integer类的内部类IntegerCache和valueOf方法代码】

public final class Integer extends Number implements Comparable<Integer> {
 
    //。。。。。。。。。。。。
 
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
 
        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;
 
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }
 
        private IntegerCache() {}
    }
 
    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
     
    //。。。。。。。。。。。。。
 
}

 

 

参考:

  1. Java中申明变量用 int 还是 Integer?
  2. Integer与int的种种比较你知道多少?