[Java基础] Integer和int使用注意点
文章目录
- 1. Integer缓存了-128到127之间的值,不在这个范围,比较值时需要用equals()方法
- 2. 由于int类型是基本数据类型,Integer拆箱时不能为空
1. Integer缓存了-128到127之间的值,不在这个范围,比较值时需要用equals()方法
- 在这个范围内,Integer.value(int i) 将返回相同的对象实例。
- 超出这个范围,每次调用都会创建新的Integer对象。
- Long也是。
public static void main(String[] args) {
// Integer和Long都是缓存在-128~127之间,所以可以直接比较,不用equals
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
System.out.println("=====");
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);
System.out.println(i3.equals(i4));
System.out.println("=====");
Long ii1 = 127L;
Long ii2 = 127L;
Long ii3 = 128L;
Long ii4 = 128L;
System.out.println(ii1 == ii2);
System.out.println(ii3 == ii4);
System.out.println(ii1.equals(ii2));
System.out.println(ii3.equals(ii4));
}
打印
true
true
=====
false
true
=====
true
false
true
true
Integer的equals方法源码
private final int value;
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
结论:
通过equals()源码可以看到它是比较的Integer中具体的值,
所以我们如果是比较对象或者比较-128~127的值可以用==,
而如果比较其他的值就需要用equals()了
2. 由于int类型是基本数据类型,Integer拆箱时不能为空
例1
public static void main(String[] args) {
// 由于int类型是基本数据类型,拆箱时不能为空
// 例1
Integer i5 = null;
System.out.println(i5 == 3);
}
报错
例2
public static void main(String[] args) {
// 由于int类型是基本数据类型,拆箱时不能为空
// 例2
Integer i5 = null;
test1(i5);
}
public static void test1(int i) {
System.out.println(i);
}
结论:
除了缓存导致比对值可能出现问题之外,
我们熟知的Integer是包装类,可以为null,int是基本数据类型,不可以为null,
在这一点上别忘了包装类拆箱时不能为null的问题。
所有包装类拆箱成基本数据类型时都存在此问题。