zoukankan      html  css  js  c++  java
  • 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源码分析”这篇博客。

  • 相关阅读:
    96. Unique Binary Search Trees
    515. Find Largest Value in Each Tree Row
    网络中数据传输的过程
    ARP/RARP协议
    JAVA静态代码块的作用及执行顺序
    MySQL中大于等于小于等于的写法
    Mybatis常见面试题总结及答案
    安全框架Shiro和Spring Security比较
    Excel VBA 连接各种数据库(一) VBA连接MySQL数据库
    Servlet、Servlet容器等内容讲解
  • 原文地址:https://www.cnblogs.com/teach/p/10246432.html
Copyright © 2011-2022 走看看