java中 int与Integer的区别和比较(==)

前言

  int 是基本类型,而Integer是其包装类。

  int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别;

int与Integer的区别

     1.声明变量时

int i; //默认初始值为0
Integer j; //默认初始值为null

   Java 中的数据类型分为基本数据类型和引用数据类型, int 是基本类型,而Integer 是引用数据类型(包装类);因此在进行初始化时,int 变量默认初始值为0;而Integer的变量默认初始值为null。

     2.初始化时

int i =1;
Integer i= new Integer(1);

   注:由于有了自动装箱和拆箱(始于jdk1.5),使得对Integer类初始化也可使用:Integer i= 1;    

   int与Integer的关系

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

 2.Integer是int的封装类;

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

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

     int 是基本数据类型(面向过程留下的痕迹,不过是对java的有益补充),Integer 是一个类,是int的扩展(包装),定义了很多的转换方法,而且还提供了处理 int 类型时非常有用的其他一些常量和方法。 类似的还有:float——Float;double——Double;boolean——Boolean等。

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

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

  举例说明

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

  并且泛型定义时也不支持int: 如:List<Integer> list = new ArrayList<Integer>();可以  而List<int> list = new ArrayList<int>();则不行。

总而言之:如果我们定义一个int类型的数,只是用来进行一些加减乘除的运算or作为参数进行传递,那么就可以直接声明为int基本数据类型,但如果要像对象一样来进行处理,那么就要用Integer来声明一个对象,因为java是面向对象的语言,因此当声明为对象时能够提供很多对象间转换的方式与一些常用的方法。自认为java作为一门面向对象的语言,我们在声明一个变量时最好声明为对象格式,这样更有利于你对面向对象的理解。

基本类型与包装类型的异同

     1、在Java中,一切皆对象,但八大基本类型(char,byte,int,double,float,short,long,boolean)却不是对象。

     2、声明方式的不同,基本类型无需通过new关键字来创建,而封装类型需new关键字。

     3、存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中。

     4、初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0(整数:包括int,short,byte,long ,初始值为0),boolean类型为false,浮点型:float,double ,初始值为0.0,字符:char ,初始值为空格,即'' ",如果输出,在Console上是看不到效果的。

     5、使用方式的不同,比如与集合类合作使用时只能使用包装类型。

   int与Integer的比较

      如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类;int的初值为0,Ingeter的初值为null。但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱。所以我对它们进行了总结,希望对大家有帮助。

首先看代码:

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);
        //Integer会自动拆箱为int,所以为true
        System.out.println(i == i2);
        System.out.println(i == i3);
        System.out.println("**************");
        Integer i4 = 127; //java在编译的时候,被翻译成-> Integer i4 = Integer.valueOf(127);
        Integer i5 = 127;
        System.out.println(i4 == i5);//true
        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println(i6 == i7);//false
        Integer i8 = new Integer(127);
        System.out.println(i5 == i8); //false
        Integer i9 = new Integer(128);
        Integer i10 = new Integer(123);
        System.out.println(i9 == i10);  //false
    }

}

首先,11行和12行输出结果都为true,因为Integer和int比较都会进行自动拆箱(jdk1.5以上)。

16行的结果为true,而19行则为false,很多人都不懂为什么。其实java在编译Integer i4 = 127的时候,被翻译成-> Integer i4 = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:

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);
}

看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer i4 = 127时,会将127进行缓存,下次再写Integer i5 = 127时,就会直接从缓存中取,就不会new了。所以16行的结果为true,而19行为false。

对于21行和24行,因为对象不一样,所以为false。

我对于以上的情况总结如下:

  ①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,i8的引用指向堆,而i5指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
  ②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
  java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存,而128>127,所以实际上Integer i2 = new  Integer(128);
  ③两个都是new出来的,都为false
  ④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较




猜你喜欢

转载自blog.csdn.net/jluqazwsx/article/details/80066562