今天在排除一个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();
}

Java字符串比较 == 和 equals方法的区别的更多相关文章

  1. JAVA面试题:equals()方法和== 区别

    http://bbs.csdn.net/topics/390000725 总结: equals在没重写之前和==一样,重写之后,equals只要内容一样即为true equals跟==一般情况下是等价 ...

  2. Java中==号与equals()方法的区别

    String str1 = new String("abc"); String str2 = new String("abc"); System.out.pri ...

  3. Java==与equals方法的区别

    摘自:http://www.cnblogs.com/dolphin0520/p/3592500.html 1.对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等: 如果作用于引 ...

  4. equals()方法 与 == 区别

    equals()方法 与 == 区别 : equals():在字符串中比较内容,则必须使用equals(变量),如果相等则为true,否则为false == :使用==比较的是地址是否一致 class ...

  5. 一、基础篇--1.1Java基础-hashCode和equals方法的区别和联系

     hashCode和equals方法的区别和联系  两个方法的定义 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回tr ...

  6. JavaScript进阶(七)JS截取字符串substr 和 substring方法的区别

    JS截取字符串substr 和 substring方法的区别 substr方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参 ...

  7. ==和equals()方法的区别

    ==和equals()方法的区别 这是一道经典的面试题,但是很多人对其一直很困惑,最近刚好复习了他们两者的区别,现总结如下: 一.==:两端可以存放不同的数据     1.放基本数据类型:根据基本数据 ...

  8. Java中hashCode、equals、==的区别

    ref:http://www.cnblogs.com/skywang12345/p/3324958.html 1.==作用: java中的==用来判断两个对象的地址是否相等:当对象是基本数据类型时,可 ...

  9. java中“==”和equals方法的区别,再加上特殊的String引用类型

    ==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为  基本数据类型  的比较和  引用数据类型 的比较 ...

  10. Java 基本数据类型 及 == 与 equals 方法的区别

    Java数据类型分为基本数据类型与引用数据类型. 1 基本数据类型 byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个字 ...

随机推荐

  1. Java压缩和解压缩zip文件

    介绍 Java提供的java.util.zip包只支持zip和gzip.至于更多格式的压缩可以选择apache的Commons Compress. 参考:https://o7planning.org/ ...

  2. SuspendThread and ResumeThread

    记录下,用于复现 #include <windows.h> #include <iostream> LRESULT CALLBACK WndProc(HWND hWnd, UI ...

  3. 新零售SaaS架构:订单履约系统的应用架构梳理

    订单履约系统的核心能力 通过分析订单履约的全流程和各个业务活动,我们可以梳理出订单履约的核心业务链路,基于业务链路,我们抽象出订单履约系统的三大系统能力,分别为履约服务表达.履约调度.物流配送. 履约 ...

  4. SpringBoot 服务接口限流,搞定!

    来源:blog.csdn.net/qq_34217386/article/details/122100904   在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.限流可以认为服务降级的一种 ...

  5. 使用winsw将jar包注册成windows服务

    使用winsw将jar包注册成windows服务 注:exe文件作用:使用winsw将jar包注册成windows服务(下载地址https://github.com/winsw/winsw/relea ...

  6. Hdf5开发笔记(一):hdf5介绍,在windows上编译msvc2015x64版本

    前言   matlab的matio库需要使用到hdf5,编译hdf5的msvc2015x64版本. HDF5介绍   HDF(Hierarchical Data Format)是一种设计用于存储和组织 ...

  7. 【LeetCode链表#8】翻转链表(双指针+递归)/K个一组翻转

    翻转链表 力扣题目链接(opens new window) 题意:反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4-> ...

  8. SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448

    SOTIF很快将会取代ISO 26262?为您详细解读SOTIF标准ISO/PAS 21448 根据MES模赛思对其全球客户的问卷调查表明, 尽管有相当一部分的参与者(35%)认为SOTIF在功能安全 ...

  9. NodeJS内存泄露

    p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 0, 0, 1) } p.p2 { margin: 0; ...

  10. 【Azure 事件中心】Azure Event Hub客户端遇见 Expired Heartbeat 错误

    问题描述 Azure Event Hub 在消费数端中,经常性遇见 Expired Heartbeat 错误 (consumer-xxxxxxxxxxxxx-c84873c6c828e8df6c843 ...