Java字符串比较 == 和 equals方法的区别
今天在排除一个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方法的区别的更多相关文章
- JAVA面试题:equals()方法和== 区别
http://bbs.csdn.net/topics/390000725 总结: equals在没重写之前和==一样,重写之后,equals只要内容一样即为true equals跟==一般情况下是等价 ...
- Java中==号与equals()方法的区别
String str1 = new String("abc"); String str2 = new String("abc"); System.out.pri ...
- Java==与equals方法的区别
摘自:http://www.cnblogs.com/dolphin0520/p/3592500.html 1.对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等: 如果作用于引 ...
- equals()方法 与 == 区别
equals()方法 与 == 区别 : equals():在字符串中比较内容,则必须使用equals(变量),如果相等则为true,否则为false == :使用==比较的是地址是否一致 class ...
- 一、基础篇--1.1Java基础-hashCode和equals方法的区别和联系
hashCode和equals方法的区别和联系 两个方法的定义 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回tr ...
- JavaScript进阶(七)JS截取字符串substr 和 substring方法的区别
JS截取字符串substr 和 substring方法的区别 substr方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参 ...
- ==和equals()方法的区别
==和equals()方法的区别 这是一道经典的面试题,但是很多人对其一直很困惑,最近刚好复习了他们两者的区别,现总结如下: 一.==:两端可以存放不同的数据 1.放基本数据类型:根据基本数据 ...
- Java中hashCode、equals、==的区别
ref:http://www.cnblogs.com/skywang12345/p/3324958.html 1.==作用: java中的==用来判断两个对象的地址是否相等:当对象是基本数据类型时,可 ...
- java中“==”和equals方法的区别,再加上特殊的String引用类型
==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为 基本数据类型 的比较和 引用数据类型 的比较 ...
- Java 基本数据类型 及 == 与 equals 方法的区别
Java数据类型分为基本数据类型与引用数据类型. 1 基本数据类型 byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个字 ...
随机推荐
- P3879 [TJOI2010] 阅读理解(水题)
[TJOI2010] 阅读理解 题目描述 英语老师留了 N 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入格式 第一 ...
- 学习go语言编程之安全编程
数据加密 对称加密 采用单密钥的加密算法,称为对称加密. 常见的单密钥加密算法有DES.AES.RC4等. 在对称加密中,私钥不能暴露,否则在算法公开的情况下,数据等同于明文. 非对称加密 采用双密钥 ...
- 教你如何判断Java代码中异步操作是否完成
本文分享自华为云社区<java代码实现异步返回结果如何判断异步执行完成>,作者: 皮牙子抓饭. 在许多应用程序中,我们经常使用异步操作来提高性能和响应度.在Java中,我们可以使用多线程或 ...
- 【LeetCode排序专题01】由旋转数组的最小数字引出的关于排序算法的讨论(冒泡排序、二分查找+暴力法)
旋转数组的最小数字 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一 ...
- 在Windows环境中配置使用我们搭建的DNS服务器
1.修改网卡的设置,首选DNS用我们自己的 2.在命令行中测试 专业的nslookup 3.已知的问题 每次在DNS服务器的web界面中,修改了解析,必须用docker restart dns命令,把 ...
- 【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
问题描述 在使用Python代码接受EventHub的消息时,根据文档要求安装azure-eventhub-checkpointstoreblob-aio模块时,出现了如下错误: ERROR: Cou ...
- dart特殊符号语法(一)
许久没有写博客.浏览以往的博客,是那么稚嫩.就让它们当成成长的照片吧.重新开始操起这个记录的爱好,一方面把它当成可以查阅的资料,方便自己:另一方面希望有帮助于人.由于个人能力,认知有限,如读者发现有纰 ...
- C#与C互操作
C#给C++传递char**(转载) extern "C" _declspec(dllexport)void GetResult(char* a,char** pBuf) { sp ...
- python使用selenium适配谷歌浏览器插件, chromedriver与chrome各版本及下载地址
python selenium使用,需要谷歌chromedriver.exe插件 chromedriver.exe插件是放在python的安装目录下(亲测,其它的都不对) 以下是chromedrive ...
- CPNtools协议建模安全分析--ML语言之颜色集定义(六)
之前一直在怀疑我是不是因为对CPN Tools的原理结构还是不够理解,对Petri网的还没有弄清楚,越往后面看这种质疑越来越严重. 之前说CPN Tools在对称和非对称算法中不能形式化的问题,后续看 ...