WangScaler: 一个用心创作的作者。声明:才疏学浅,如有错误,恳请指正。
基本变量判等
我们知道==是比较运算符判断是否相等,而=是赋值语句,所以我们习惯用==来判断两个变量是否相等。其实==只能用在基本变量的判断。
public class EqualsDemo {
public static void main(String[] args) {
int a = 10;
int b = 11 - 1;
System.out.println(a == b);//true
}
}
引用类型的判等
而引用类型使用==判等是不能获得预期的结果的,因为==是对其引用的内存地址进行比较。有人说使用Integer时,有时候可以判等成功,有时候不行。
public class EqualsDemo {
public static void main(String[] args) {
Integer a = 1;
Integer b = 1;
Integer c = 129;
Integer d = 129;
System.out.println(a == b);//true
System.out.println(c == d);//false
}
}
这种情况造成的原因是java底层做了常量池。当Integer的值在-127到128之间,他是通过IntegerCache在数组中(上述的常量池)取出的,而超过范围的则是重新new的,大家可以参考我的往期文章Java易错点2。那么我们应该如何判重,应该使用equals方法,equals方法的本身也是地址值的比较和==是一样的,因为equals的底层也是==来判重,不过在引用类型中重写了equals才变成了值的比较,大家也可以通过我的往期文章Java易错点2来了解。
public class EqualsDemo {
public static void main(String[] args) {
Integer a = 1;
Integer b = 1;
Integer c = 129;
Integer d = 129;
System.out.println(a.equals(b));//true
System.out.println(c.equals(d));//true
}
}
Equals的坑
我们初学开发,最常见的异常就是空指针异常,同样equals会有空指针异常的坑。我们的对象是User
class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
可以看到该对象只有两个参数,一个是id,一个是name。接下来我们从 数据库读取数据,而数据库的数据只有id,而name为null。我们模拟这样一条数据,就不写从数据库读了。
User user = new User();
user.setId(1);
假设上面的User是从数据库读取得来的,我们先判空,然后进行比较。
public class EqualsDemo {
public static void main(String[] args) {
User user = new User();
user.setId(1);
if (user!=null){
System.out.println(user.getName().equals("aa"));
}
}
}
很明显,上面的程序会报空指针异常,但是我们在写的时候可能不会注意到有问题。
但是如果我们反过来写,
System.out.println("a".equals(user.getName()));
那么结局就不一样了。所以大家一定注意,注意编程过程中的每个细微之处,你的程序才会更加健壮。
最后
前人栽树,后人乘凉。前人踩坑,后人继续掉,哈哈哈哈。
来都来了,点个赞再走呗!关注WangScaler,祝你升职、加薪、不提桶!