Java字符串比较 == 和 equals方法的区别

本文通过一个实际的bug例子,讲述了在处理JSON数据时,使用getString方法获取到的空字符串和null值,不应直接用双等号比较,而应使用equals方法。双等号判断的是对象的引用,而equals比较的是内容。同时指出null不会转换为null字符串对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


今天在排除一个bug的时候出现了一个很低级但是也很容易被忽视的错误,在此写了一个小例子做记录。

首先我先说一下错误的场景,我读取了一段json数据,并使用JSONObject的实例对象的getString方法去拿到了一个value数据,由于我忽视了getString方法的返回值是一个String对象,所以我在后面的处理使用了双等号去判断这个值 是否 等于 "" 或者 null ,所以这就出现了逻辑问题,导致程序出错。

举个例子,假如这个json串是这个样子的:

{
  "str1" : null,
  "str2" : ""
}

两个value分别是空字符串和null,当我使用getString方法去获取值的时候,实际上拿到的是两个被转为String对象示例的值,也就是:

String str1 = new String("");

String str2 = new String("null");

str1 == ""
所以当我使用 == 去判断 "" 和 一个 String空串对象是否相等的时候,那一定会返回false,因为双等号判断的是两个变量的地址是否相同,很显然,"" 位于字符串常量池,而str1是String对象的示例,位于堆空间,二者的地址一定是不同的。

如果想要比较,应该用这个方法equals( )。

"".equals(str1)	// 最好把变量放在equals里面,防止空指针异常。
// 该语句会返回true,因为比较的是字符串的内容是否一样,而且"" 其实首先会转为String对象再去和equals里面的参数进行比较,所以结果肯定是true。

null不会被转为null字符串对象,也即不会变成 "null" 。

test.json

{
  "str1" : null,
  "str2" : ""
}

例子

String jsonFilePath = "D:\\school\\technology_novelty_search_data_analysis_system\\tech\\src\\main\\java\\com\\ruoyi\\test\\qcc\\test.json";
        try {
            // 读取 JSON 文件内容
            String jsonString = new String(Files.readAllBytes(Paths.get(jsonFilePath)));
            // 解析 JSON
            JSONObject jsonObject = JSON.parseObject(jsonString);
            // 获取某个值
            String str1 = jsonObject.getString("str1");
            // 其实 str2 和 str3 是一样的类型 都是String空串对象
            String str2 = jsonObject.getString("str2");
            String str3 = new String("");

            // null 不会被转为 null 字符串对象
            System.out.println("str1: " + str1);
            System.out.println(str1 == null);   // true
            System.out.println("null".equals(str1));   // false

            System.out.println("str2: " + str2);
            System.out.println("str3: " + str3);
            System.out.println(str3 == ""); // false
            System.out.println("".equals(str2));    // true
            System.out.println("".equals(str3));    // true
        } catch (IOException e) {
            e.printStackTrace();
        }

image-20230708154408621

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靠谱杨

感谢您的认可和鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值