这是最近有人问我的一个问题,我当时解答了,但是发现解答的并不是很全面,所以花时间稍微整理了一下

我们先来看一下java的基本类型和其封装类

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

我们不妨从单个点入手,看看最常用的int和integer有什么区别:

1、Integer是int的包装类,int是一种基本的数据类型,int是JAVA缺省的8中基本数据类型之一.不是类的对象.

2、Integer变量必须实例化后才能使用,而int变量不需要

3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 

4、Integer的默认值是null,int的默认值是0,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。

返回数据库字段值是null的话,实体类中用int类型接收的话会报错。int是基本数据类型,其声明的是变量,而null则是对象。所以建议用integer;

正常情况下,最好使用int,比如for循环的时候,int是基本数据类型,节省内存,用integer没有必要。用int返回后,若要使用integer类的方法还可以将int包装成integer对象,不使用对象方法更好。

int 是基本类型。

Integer是引用类型。。

比如int a= 5;
Integer b = 5;

对于a你只能用来做计算。。比如加减乘除。。

b你可以用来做很多事情,因为他是一个对象,他有很多方法,你可以像使用String对象那样使用它。    java.lang.Integer是一个类.对它的操作要通过类的方法,可以toString等,而int不行  

另外,Integer对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了

总结一下几个点:

1. int 和Integer在进行比较的时候,Integer会进行拆箱,转为int值与int进行比较。

2. Integer与Integer比较的时候,由于直接赋值的时候会进行自动的装箱,那么这里就需要注意两个问题,一个是-128<= x<=127的整数,将会直接缓存在IntegerCache中,那么当赋值在这个区间的时候,不会创建新的Integer对象,而是从缓存中获取已经创建好的Integer对象。二:当大于这个范围的时候,直接new Integer来创建Integer对象。

3. new Integer(1) 和Integer a = 1不同,前者会创建对象,存储在堆中,而后者因为在-128到127的范围内,不会创建新的对象,而是从IntegerCache中获取的。那么Integer a = 128, 大于该范围的话才会直接通过new Integer(128)创建对象,进行装箱。