Java int和Integer的区别
public class IntAndInteger {
public static void main(String[] args) {
/*
* 比较int 与 Integer 的区别
* 1、Integer是int的包装类,int则是java的一种基本数据类型
* 2、Integer变量必须实例化后才能使用,而int变量不需要
* 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
* 4、Integer的默认值是null,int的默认值是0
*/
int a = 100;
int b = 100;
Integer m = new Integer(100);
Integer n = new Integer(100);
/*
* int 与 int 之间只是进行值的比较
*/
if (a == b) {
System.out.println("a = b");
}else System.out.println("a != b"); // a = b
/*
* int 与 Integer 进行比较时:Integer会进行拆包java会自动拆包装为 int
*/
if (a == m) {
System.out.println("a = m");
}else System.out.println("a != m"); // a = m
/*
* 由于Integer变量实际上是对一个Integer对象的引用,
* 所以两个通过new生成的Integer变量永远是不相等的
* (因为new生成的是两个对象,其内存地址不同)。
*/
if (m == n) {
System.out.println("m = n");
}else System.out.println("m != n"); // m != n
/*
* 非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。
* (因为非new生成的Integer变量指向的是java常量池中的对象,
* 而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
*/
Integer p = 100 ;
if (m == p) {
System.out.println("m = p");
}else System.out.println("m != p"); // m != P
Integer q = 100;
Integer z = 128;
/*
* 对于两个非new生成的Integer对象,进行比较时,
* 如果两个变量的值在区间-128到127之间,则比较结果为true,
* 如果两个变量的值不在此区间,则比较结果为false
*/
if (q == p) {
System.out.println("q = p");
}else System.out.println("q != p"); // q = P
if (z == p) {
System.out.println("z = p");
}else System.out.println("z != p"); // z != P
/*
* 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了
*/
}
}