问题描述

今天在使用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和==方法比较(一)的更多相关文章

  1. 03_10_Object类的toString equals等方法

    03_10_Object类的toString equals等方法 1. toString方法 Object类中定义有public String toString()方法,其返回值是String类型,描 ...

  2. equals(),hashcode()方法详解

    Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用. equals ...

  3. equals和==方法比较(二)--Long中equals源码分析

    接上篇,分析equals方法在Long包装类中的重写,其他类及我们自定义的类,同样可以根据需要重新equals方法. equals方法定义 equals方法是Object类中的方法,java中所有的对 ...

  4. 自定义条件判断两对象相等Equals的方法

    自定义两对象是否相等方法,必须用到GetHashCode方法,如 public class AirspaceCompareByUUID : IEqualityComparer<AIRSPACE_ ...

  5. Java—API/Obiect类的equals toString方法/String类/StringBuffer类/正则表达式

    API  Java 的API(API: Application(应用) Programming(程序) Interface(接口)) 就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来 ...

  6. equals和==方法比较(三)--Long中LongCache源码分析

    下面我们来分析,上篇博客中遗留的问题,为什么下方的两个一个是true,两一个是false那? //true Long l1=123l; Long l2=123l; System.out.println ...

  7. lombok 简化 get set toString hash equals等方法

    1.lombok 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. 2.安装 下载 https://projectlombok.or ...

  8. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

  9. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

随机推荐

  1. IO流操作详解

    注:FileReader继承InputStreamReader类,InputStreamReader实现Reader接口,其他同理. 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 其中, ...

  2. Java特性之继承的应用

    继承是为了复用,复用是为了减少冗余的代码,提高开发效率. 这次我讲继承,仅仅只是讲它在我开发中一个小小的应用,就是关于Controller日志打印.我们通常使用日志,要么是使用slf或者是log4j. ...

  3. SpringBoot实战(十)之使用Spring Boot Actuator构建RESTful Web服务

    一.导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...

  4. .NET Core中NETSDK1061错误解决(转载)

    NETSDK1061错误解决 在vs生成和运行都正常,发布的时候报错 .netcore控制台项目引用另一个类库 错误信息 NETSDK1061: 项目是使用 Microsoft.NETCore.App ...

  5. Java 常用IO流操作详解

    1.基本概念 IO:Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中. 2.IO流的分类 图示:(主要IO流) 3.字节流 ...

  6. 【Linux】Linux文件跟目录管理

    熟悉Linux的大家都知道,在Linux中,一切皆文件,可能在有些人的理解中,Linux跟我们的Windows差不多,是都具有图形操作界面的一种操作系统,但是更深入的来说,Linux更偏向于用命令操作 ...

  7. jQuery的$.get()函数不执行以及php端报错Uncaught Error: Call to a member function bind_param() on boolean in...

    写了一个html,用到了jQuery,发现没有按照预期的结果显示,最后定位到是$.get()函数没有运行 调试过程为: 在页面右击查看元素,到网络那一栏,找到类型为json的那个包点击,然后查看响应, ...

  8. MongoDB固定集合(capped collection)

    一 . 什么是固定集合 MongoDB中有一种特殊类型的集合,值得我们特别留意,那就是固定集合(capped collection). 固定集合可以声明collection的容量大小,其行为类似于循环 ...

  9. IDEA 通过插件jetty-maven-plugin使用 jetty

    jetty:run -Djetty.port=8080 pom.xml配置 <build> <plugins> <plugin> <groupId>or ...

  10. 20155230 2016-2017-2《Java程序设计》第二周学习总结

    20155230 2016-2017-2 <Java程序设计>第er周学习总结 教材学习内容总结 JAVA编程风格 1.命名变量时不可以使用数字及特殊字符作为开头. 2.变量名称不可以与J ...