开发踩坑之判等问题

简介: 开发过程中避免不了判等问题?你在判等的过程中有没有遇到过坑呢?那么你是怎么解决的?快来看看我们是不是一样。
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,祝你升职、加薪、不提桶!

目录
相关文章
|
XML Java 数据格式
5.12.1Java开发初级
5.12.1Java开发初级
111 0
|
Java 开发工具 git
Java开发初级6.24.3
5.在Git使用过程中,进行Git配置的操作命令是哪个() A. config B. config -g C. config -a D. git config 相关知识点: 在git中,经常使用git config 命令用来配置git的配置文件,git配置级别主要有:仓库级别 local 【优先级最高】、用户级别 global【优先级次之】、系统级别 system【优先级最低】 正确答案:D 10.RDBMS是什么? A. Rela Database Management Systems B. Relational Database Management Systems C. Relation
112 0
|
SQL 前端开发 JavaScript
Java开发初级6.23.2
3.Java网站src/main/java目录保存的是什么资源? A. Java源代码文件 B. 测试代码 C. JavaScript、CSS等文件 D. 图片资源 正确答案:A 4.什么是索引Index? A. SQL数据库里的表管理工具 B. SQL数据库里的查询工具 C. SQL数据库里的目录工具 D. SQL数据库用来加速数据查询的特殊的数据结构 正确答案:D
190 0
|
Java
Java开发初级6.22.1
1.下面关于泛型的描述中错误的一项是? A. “? extends 类”表示设置泛型上限 B. “? super 类”表示设置泛型下限 C. 利用“?”通配符可以接收全部的泛型类型实例,但却不可修改泛型属性内容 D. 如果类在定义时使用了泛型,则在实例化类对象时需要设置相应的泛型类型,否则程序将无法编译通过 相关知识点: https://edu.aliyun.com/course/35 正确答案:D 2.下列选项中属于SVN中控制鉴权用户访问版本库的权限默认权限的是() A. write B. read C. none D. null 相关知识点: auth-access:取值范围为"writ
127 0
|
Java
Java开发初级6.21.1
1.下面关于泛型的描述中错误的一项是? A. “? extends 类”表示设置泛型上限 B. “? super 类”表示设置泛型下限 C. 利用“?”通配符可以接收全部的泛型类型实例,但却不可修改泛型属性内容 D. 如果类在定义时使用了泛型,则在实例化类对象时需要设置相应的泛型类型,否则程序将无法编译通过 相关知识点: https://edu.aliyun.com/course/35 正确答案:D 2.下列选项中属于SVN中控制鉴权用户访问版本库的权限默认权限的是() A. write B. read C. none D. null 相关知识点: auth-access:取值范围为"writ
130 0
|
Java 开发工具 git
Java开发初级6.14.3
Java开发初级6.14.3
114 0
|
Java 开发工具 git
Java开发初级6.12.3
Java开发初级6.12.3
73 0
|
SQL 前端开发 JavaScript
Java开发初级6.10.2
Java开发初级6.10.2
78 0
|
Java
Java开发初级6.7.1
Java开发初级6.7.1
58 0
|
SQL 前端开发 JavaScript
Java开发初级6.4.2
Java开发初级6.4.2
92 0