开发踩坑之判等问题

1,121 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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,祝你升职、加薪、不提桶!