equals和==方法比较(一)
问题描述
今天在使用spotbugs代码走查时发现这样一个问题,两个Long类型的变量使用==判断数值是否相等,spotbugs提示这是一个很致命的错误,代码大概如下,
Long l1=123l;
Long l2=123l;
System.out.println(l1==l2);
上面是两个Long类型的变量l1和l2,打印的结果是true,再看下面的代码,
Long l1=123456l;
Long l2=123456l;
System.out.println(l1==l2);
同样是两个Long类型的变量l1和l2,打印的结果却是false,这是为什么那?
暴露的问题
上面的代码,暴露下面两个问题
1、包装类型的两个变量的数值比较不能使用==,应使用equals方法,;
2、为什么上面两次的结果不一样那,到底哪种情况下是对的;
问题剖析
数值的正确比较方式
从上面的代码中可以看出,
1、变量l1和l2使用的是包装类(Long),而不是基本数据类型long,我们知道对java中的两个引用类型使用==比较符,比较的是两个对象的引用地址是否相等;
2、对于基本数据类型,使用==比较符比较的是两个变量的值是否相等,为此,下面的两个代码,都是true
long l3=123l;
long l4=123l;
//l3==l4 true
long l5=123456l;
long l6=123456l;
//l5==l6 true
3、对于基本类型的包装类型的比较方式,请使用equals方法,下面的两个代码,都是true
Long l1=123l;
Long l2=123l;
System.out.println(l1.equals(l2)); Long l11=123456l;
Long l22=123456l;
System.out.println(l11.equals(l22));
这里有一个问题,为什么使用了equals方法上面的代码都是true了,那是因为Long这个包装类重写了equals方法。
equals()方法源码请查看“equals和==方法比较(二)--Long中equals源码分析”这篇博客。
请记住,对于引用类型使用==比较符比较的是其引用地址,使用equals大都是比较的其内容,具体还要看重写的equals方法的逻辑;
对基本类型使用==比较符比较的是字面量值是否相等;
针对暴露的问题2,请看“equals和==方法比较(三)--Long中LongCache源码分析”这篇博客。
equals和==方法比较(一)的更多相关文章
- 03_10_Object类的toString equals等方法
03_10_Object类的toString equals等方法 1. toString方法 Object类中定义有public String toString()方法,其返回值是String类型,描 ...
- equals(),hashcode()方法详解
Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用. equals ...
- equals和==方法比较(二)--Long中equals源码分析
接上篇,分析equals方法在Long包装类中的重写,其他类及我们自定义的类,同样可以根据需要重新equals方法. equals方法定义 equals方法是Object类中的方法,java中所有的对 ...
- 自定义条件判断两对象相等Equals的方法
自定义两对象是否相等方法,必须用到GetHashCode方法,如 public class AirspaceCompareByUUID : IEqualityComparer<AIRSPACE_ ...
- Java—API/Obiect类的equals toString方法/String类/StringBuffer类/正则表达式
API Java 的API(API: Application(应用) Programming(程序) Interface(接口)) 就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来 ...
- equals和==方法比较(三)--Long中LongCache源码分析
下面我们来分析,上篇博客中遗留的问题,为什么下方的两个一个是true,两一个是false那? //true Long l1=123l; Long l2=123l; System.out.println ...
- lombok 简化 get set toString hash equals等方法
1.lombok 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. 2.安装 下载 https://projectlombok.or ...
- java中hashCode方法与equals方法的用法总结
首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...
- Java提高篇——equals()与hashCode()方法详解
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...
随机推荐
- programming-languages学习
programming-languages学习 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {backg ...
- python文件操作指令
原文地址:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html 常用的文件操作指令: python中对文件.文件夹(文件操 ...
- HDU 1116 Play on Words(欧拉回路+并查集)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Play on Words Time Limit: 10000/5000 MS (Java/Ot ...
- HDU 1058(打表)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1058 Humble Numbers Time Limit: 2000/1000 MS (Java/O ...
- 非法字符:“\ufeff”
解决方法 将编码格式UTF-8+BOM文件转为普通的UTF-8文件. 用Notepad++打开文件,将编码从UTF-8+BOM改为UTF-8
- 【HTML5-基础-SVG实践】
关于svg HTML页面常用加载svg图片方式: HTML元素 // data 和 type 至少指定一项 <object data = './public/icon.svg' width='2 ...
- Spring Boot与Mybatis 借助Fastjson快速完成数据解析入库
通过Spring Boot可以快速搭建一个项目结构,在此基础上本文就通过一个简单的例子,说明如何结合Mybatis 和 Fastjson,快速的完成一个数据的入库基本操作. 添加相关的依赖 <d ...
- Ubuntu16.04安装TensorFlow
1.查看tensoflow与CUDA对应版本: windows端:https://tensorflow.google.cn/install/source_windows Linux端:https:// ...
- jQuery|简单tab栏切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 默认情况下eth0网卡配置文件路径及客户端DNS的路径
默认情况下eth0网卡配置文件路径及客户端DNS的路径? eth0 网卡配置文件路径如下: /etc/sysconfig/network-scripts/ifcfg-eth0 客户端DNS的路径如下: ...