Java中Integer和int的区别
2020/1/31
先行补充几个知识点
- Integer是int的封装类,而int是Java的一个基本数据类型,也不难想到其他7个基本数据类型也有对应的封装类
- Integer变量必须实例化才能使用,而int变量是可以不用实例化,这里说的实例化就是赋值,否则使用该变量的时候会报错
- Integer变量指向Integer对象,int直接存储数据值
- Integer是一个对象(引用类型),所以Inetger变量的默认值为null(虽然感觉这个知识点有点用不到),int是基本数据类型,int变量的默认值为0
关于Integer和int区别详解
- 两个new出来的Integer变量不相等
public class Test{
public static void main(String[] args){
Integer i = 1;
Integer j = 1;
System.out.println(i == j);//false
}
}
- Integer变量与int变量作比较时,只要内容相等,结果就是true。在把Integer变量与int变量比较时,会把Integer拆封为int类型在进行比较,所以只要内容相等就会返回true
public class Test{
public static void main(String[] args){
int i = 1;
Integer j = 1;
Integer k = new Integer(1);
System.out.println(i == j); //true
System.out.println(i == k); //true
}
}
- new出来的Integer变量和非new出来的变量比较一定是false,有两种情况:
-
- 有两种情况:
-
-
- 当比较非new变量的值在-128~127闭区间内,也就是从Integer创建的一个数组中取出这些对象,而new出来的变量指向在堆中创建的对象,所以内存地址不同,结果为false
-
-
-
- 当比较的非new变量的值不在闭区间内,此时非new变量是怎么操作的呢,这个时候Integer变量自动装箱,起始是在堆中创建了对象,所以还是不同,结果仍然为false
-
public class Test{
public static void main(String[] args){
Integer i = 1;
Integer j = new Integer(1);
System.out.println(i == j); //false
}
}
- 两个非new生成的Integer对象进行比较时,如果这两个变量的值在-128到127这个闭区间之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false,当然如果两个变量数值不相等一定为false
-
- 总结了网上的解释,出现分区间的原因:java会对-128到127闭区间的Integer数值进行缓存也就是已经在字符串常量池中了,用的时候直接拿,而在这个区间外的非new出来的Integer变量在内部仍是new出来的,所以内存地址值不同
public class Test{
public static void main(String[] args){
Integer i = 1;
Integer j = 1;
Integer k = 128;
Integer l = 128;
System.out.println(i == j); //true
System.out.println(k == l); //true
}
}
若有错误地方,请指出,谢谢大家
参考: