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类是类继 ...
随机推荐
- 【PHP】 mysqli_autocommit() 函数
//获取每一篇文章的内容 function getPost($f_parent_id, $f_title, $f_username, $f_board_id,$f_post_time, $f_ip,$ ...
- 33、springboot整合springcloud
Spring Cloud Spring Cloud是一个分布式的整体解决方案.Spring Cloud 为开发者提供了在分布式系统 (配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token ...
- [转]百度地图API详解之地图坐标系统
博客原文地址:http://www.jiazhengblog.com/blog/2011/07/02/289/ 我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需 ...
- Luogu_4197 Peaks
P4197 Peaks 并不会克鲁斯卡尔重构树,于是就写了离线算法. 使用了最小生成树,启发式合并treap 在最小生成树,克鲁斯卡尔算法 时 ,将询问一块处理.便可以保证询问时边的要求.然后利用平衡 ...
- vlc源码分析(三) 调用live555接收RTSP数据
首先了解RTSP/RTP/RTCP相关概念,尤其是了解RTP协议:RTP与RTCP协议介绍(转载). vlc使用模块加载机制调用live555,调用live555的文件是live555.cpp. 一. ...
- GitHub学生认证示范
打开网址:https://education.github.com/ 点击Get Your Pack 点击I am a Student 填写资料上传学生证照片,等待通过,如果没有GitHub账号就注 ...
- 【星云测试】开发者测试-采用精准测试工具对Spring Boot应用进行测试
简介:本文主要介绍把现今主流的springboot框架项目和精准测试工具进行结合和应用,通过精准测试的数据穿透.数据采集.测试用例与代码的双向追溯.数据分析等一系列精准测试的特有功能,达到对项目质量的 ...
- cocos2dx lua 一键资源管理PowerShell脚本实现
特别说明 此管理脚本不包含图片资源加密,热更新资源文件列表是md5 和 文件路径构成的txt,如下 脚本文件是放在和res src 同级的文件夹里面 脚本内容如下 clear $PSDefaultPa ...
- css中的定位问题
由于我最近在修改自己的网页布局,突然发现了自己对css中的定位概念还是混淆的,于是通过查官方文档,大神博客,自己实践,重新梳理了css定位的知识点.如果有不对的地方,请指正
- vs code 修改文件的缩进
百度这个问题的都是强迫症患者. 前人代码是2个空格缩进,我习惯3个, step1:打开 文件 —> 首选项 —> 设置,进入用户设置 step2:设置缩进量,(加两句代码) step3 ...