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类是类继 ...
随机推荐
- 【React】使用 create-react-app 快速构建 React 开发环境
create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境. create-react-app 自动创建的项目是基于 Webpack + E ...
- SpringMVC整合FreeMarker实例
FreeMarker作为模板引擎,是比较常用的. FreeMarker官方文档地址为:https://freemarker.apache.org/ 现在浏览器或者翻译工具这么多,对于英文方面,我想大多 ...
- Eclipse中修改git地址、用户、密码
1. 修改Url Window > Preferences > Team > Git > Configuration > Repository Settings 2. 修 ...
- 在Java中使用Maven配置的版本信息
我们在使用maven开发一些项目的时候需要知道当前的版本状态,但版本状态储存在pom.xml文件中,可以采用以下2种方式进行获取: 1. 采用xml解析的方式去获取pom文件的{project.ver ...
- 【Javascript-基础-ecma6】ecma6学习笔记(持续更新)
makdown语法手册API String 新特性的方法 基本不支持IE浏览器 String.fromCodePoint(6特性) String.prototype.codePointAt(6特性) ...
- 并发编程(三)------并发类容器Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.JDK里的COW容器有两种: CopyOnWriteArrayList CopyOnWriteArraySet CopyOnWri ...
- iOS 第三方库、插件、知名博客总结
iOS 第三方库.插件.知名博客总结 用到的组件 1.通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图 ...
- XML的序列化用法 vs平台开发
protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { NewMethod(); } } #region 读取 ...
- NOIP模拟赛D2T1自己的解题思路
T1题目在此: 数轴上有n个球,每个球直径为1,第 ii 个球的左端点为pi即占据了数轴上[pi,pi+1][pi,pi+1]).在 P位置有一堵墙.有q个操作,每次要么以x位置为左端点放一个新球(如 ...
- 为什么浏览器控制台返回不是undefined,而是一串数字
setTimeout( (function(){console.log("ok")} )(), 16) 在浏览器控制台输入这段代码的时候返回的不是"undefined&q ...