java中Integer和int的区别

来源:互联网 发布:js 创建json数组 编辑:程序博客网 时间:2024/06/03 08:11

Integer和int的区别

1.首先,Java有两种类型,一种是基本类型,如int.

  另外一种是引用类型,如integer.所以,它们的类型是不同的。

2. 基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址

3.【本部分来源于网络:

   参考网址:http://blog.csdn.net/sgls652709/article/details/49079767

 在一些特殊的类中,如Integer在使用==比较的时候往往非常容易出错,下面通过几个例子来探索一下具体的原理

  publicclass Test03 {

 

    publicstaticvoid main(String[]args) {

        Integer f1 =100, f2 = 100, f3 = 150, f4 =150;

 

        System.out.println( f1 ==f2);//true

        System.out.println( f3 ==f4);//false

    }

}

当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。

Integer f1 =Integer.valueOf(100);

Integer f2 =Integer.valueOf(100);

Integer f3 =Integer.valueOf(150);

Integer f4 =Integer.valueOf(150);

思考:那么Integer.valueOf()返回的Integer是不是是重新newInteger(num);来创建的呢?如果是这样的话,那么== 比较返回都是false,因为他们引用的堆地址不一样。

 

具体来看看Integer.valueOf的源码

public static IntegervalueOf(int i) {

        if (i >= IntegerCache.low &&i <= IntegerCache.high)

            return IntegerCache.cache[i +(-IntegerCache.low)];

        return new Integer(i);

}

在IntegerCache中cache数组初始化如下,存入了-128 - 127的值

cache = new Integer[(high -low) +1];

int j = low;

for(int k = 0; k <cache.length ; k ++)

    cache[k] =new Integer(j ++);

从上面我们可以知道给Interger 赋予的int数值在-128- 127的时候,直接从cache中获取,这些cache引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i) 这个地址是新的地址,不可能一样的

代码片段

publicstaticvoid main(String[]args) {

    Integer a =new Integer(3);

    Integer b =3;                

    int c = 3;

    System.out.println(a ==b);   

    System.out.println(a ==c);   

}

a == b分析 
Integer b = 3; 自动调用Integer.valueOf(3) 返回一个Integer的对象。 这个对象存放到cache中的(上面一段代码分析)。 而 Integer a = new Integer(3);这里创建了一个新的对象Integer 所以 a== b 返回的是false

a == c 分析 
一个Integer 与int比较,先将Integer转换成int类型,再做值比较,所以返回的是true。

参考资料《探索java基本类型和包装类型的使用运算符==进行比较的底层细节》

延伸

java中还有与Integer类似的是Long,它也有一个缓存,在区间[-128,127]范围内获取缓存的值,而Longlong比较的时候先转换成long类型再做值的比较。

简单的说,如果整型变量的值在-128127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以f1==f2的结果是true,而f3==f4的结果是false

Double类型,它没有缓存,但是当Doubledouble比较的时候会先转换成double类型,再做值的比较

4.【本部分参考网络:

    网址:https://www.cnblogs.com/shenliang123/archive/2011/10/27/2226903.html

  Integer和int的区别:

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

2.Integerint的封装类;

3.intInteger都可以表示某一个数值;

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

5. Integer默认值是null,而int默认值是0

举例说明

  ArrayList al=new ArrayList();

  int n=40;

  Integer nI=new Integer(n);

  al.add(n);//不可以

  al.add(nI);//可以

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

  

5.比较综合全面的一个示例:

package test3;

public class IntegerAndInt {

       public static void main(String[] args) {

              Integer a1=100,a2=100,a3=1000,a4=1000 ;

              //------------------------------------

              Integer b1=new Integer(100);

              Integer b2=new Integer(100);

              //------------------------------------

              int c1=new Integer(100);

              Integer c2=new Integer(100);

              //------------------------------------

              int d1=new Integer(1000);

              Integer d2=new Integer(1000);

              //------------------------------------

              int e1=new Integer(100);

              int e2=new Integer(100);

              //------------------------------------

              System.out.println(a1==a2);

              System.out.println(a3==a4);

              System.out.println(b1==b2);

              System.out.println(c1==c2);

              System.out.println(d1==d2);

              System.out.println(e1==e2);

       }

}

 微笑本文由安康学院“雨季”原创!

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击