Integer 与 Int 的区别

Integer 类整形 与  Int 整形 的区别

最近在翻java的源码,发现了一些平常不注意,但很容易出错的东西,最近有空的话就整理出来。

Integer:是一个int的包装类,Integer变量的存储需要实例化Integer的实例对象,其默认值为 null。

  原文:The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int.

int:是一种原始的数据类型,直接存储数据值,其默认值为0。

后发现 在JAVA中 每个原始的类型都有一个等效的包装类,这些包装类都继承自Object类,所以也可以用于集合或者泛型。

byte has Byte
short has Short
int has Integer
long has Long
boolean has Boolean
char has Character
float has Float
double has Double

integer 与 int的类型比较

通过new生成的:

1.两个New的Integer 

1 Integer i = new Integer(100);
2 Integer j = new Integer(100);
3 System.out.print(i == j); 
4 //source:false

解释:Integer是创建了两个实例的对象,比较时是对比两个对象的内存地址,所以不相符

2.New的integer与int

Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); 
//source:true

  解释:当integer变量和int变量进行对比时,只要值相等,则结果就是正确的。 java会对integer自动拆包转化类型为int,然后两个int类型进行对比。

非New生成的:

1.非new生成的Integer变量和new integer()生成的变量进行比较

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); 
//source=false

  解释:非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同。

2.两个非new生成的Integer对象 

  结果: 如果两个变量的值在区间-128到127之间,则比较结果为true,

      如果两个变量的值不在此区间,则比较结果为false

Integer i = 100;
Integer j = 100;
System.out.print(i == j); 
//source:true

Integer i = 128;
Integer j = 128;
System.out.print(i == j); 
//source:false

  解释:java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100),

//而java API中对Integer类型的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); }

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

以上

猜你喜欢

转载自www.cnblogs.com/ccup/p/cc.html