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]范围内获取缓存的值,而Long与long比较的时候先转换成long类型再做值的比较。
简单的说,如果整型变量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以f1==f2的结果是true,而f3==f4的结果是false。
Double类型,它没有缓存,但是当Double与double比较的时候会先转换成double类型,再做值的比较
4.【本部分参考网络:
网址:https://www.cnblogs.com/shenliang123/archive/2011/10/27/2226903.html
】
Integer和int的区别:
1.int是基本的数据类型;
2.Integer是int的封装类;
3.int和Integer都可以表示某一个数值;
4.int和Integer不能够互用,因为他们两种不同的数据类型;
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);
}
}
本文由安康学院“雨季”原创!