开发踩坑之判等问题

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

目录
相关文章
|
JavaScript 前端开发 数据库
让你少踩坑的fastadmin教程(3)
让你少踩坑的fastadmin教程
1411 0
让你少踩坑的fastadmin教程(3)
|
5月前
|
JSON Java 程序员
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(2)
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(2)
56 3
|
5月前
|
SQL Java 程序员
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(1)
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(1)
220 1
|
6月前
|
消息中间件 设计模式 架构师
开发同学的“做事情”&“想事情”&“谈事情”
作为一名后端偏业务向的一线开发,作者抛开技术栈和方案经验等这些具体的内容,从做事情、想事情、谈事情三个方面总结了自己的一些感悟。
|
前端开发 JavaScript API
wordpress插件开发踩坑记
想要使用 REST API 需要自己额外安装插件:WordPress REST API,现在 WordPress 5.0以上的版本已经默认支持 REST API了,不需要额外去安装插件
126 0
|
JavaScript 程序员 API
程序员为什么会在开发中阅读源码?
作为程序员的大家想必都会在开发的时候,去阅读源码。在实际开发中,开发者经常需要阅读和理解源代码,阅读源码是一种非常有用的技能,它可以帮助程序员更好地了解代码、解决问题、学习新技术和提高编码能力。阅读源码的过程实质上是对软件构建技术和架构深度的一种持续学习和理解。阅读源码可以揭示代码的内在逻辑,这被看作是对技术深度理解的一种体现,它能提高我们对技术的理解程度。结合阅读《Node 中的 AsyncLocalStorage 的前世今生和未来》这篇文章之后,我深刻体会到了作为开发者阅读源码的重要性和必要性。通过阅读这篇文章,我对 AsyncLocalStorage 的实现原理和使用方式有了更深入的理解
231 3
程序员为什么会在开发中阅读源码?
|
运维 Java 关系型数据库
spug上线服务踩坑记
spug是一款优秀的自动化运维平台, 这让我们想自动化又向前迈了一步.
547 0
|
前端开发 JavaScript ice
flexiwan项目踩坑实践
flexiManage是以色列一家初创公司flexiWAN开源的基于SD-WAN平台的应用层的框架,包括flexiManage服务端框架以及硬件侧的flexiAgent框架,然而其并没有开源前端框架,为了验证其SD-WAN方案的可行性,需要快速搭建一个前端应用
268 0
|
移动开发 运维 小程序
「趣学前端」Taro迁移完成之后,总结了一些踩坑经验
之前老项目的多端迁移选择了Taro框架,这次终于将项目上线了,总结了一波踩坑经验。
335 0
最近的踩坑分享 | 技术文档和需求拆解
最近的踩坑分享 | 技术文档和需求拆解
116 0
最近的踩坑分享 | 技术文档和需求拆解