详解java 中 == 和 equals 的区别(源码分析)

总结:

               ==:比较的是地址

               equals:Integer,String,Date,Double比较的是值得大小(其他的例如char等,因为它没有重写equals方法,equals方法本身比较的是地址,下文详细说明)

分析:

1、==

      1、基本数据类型(byte、short、int、long、float、double、char、boolean)  ,==比较的是“值”是否相等。

             (因为值相等的基本数据类型在内存放在同一地方。)

        Double a1 = 10.0;
        float a2 = 10f;
        long a3 = 10;
        short a4 = 10;
        int b1 = 10;
        boolean c1 = (a1 == b1);
        boolean c2 = (a1 == a2);
        boolean c3 = (a3 == a4);
        System.out.println(c1+" "+c2+" "+c3);

         结果:

     2、如果是引用类型变量,比较的是对象的地址。

            引用类型:是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。

 

            运行结果:

          

扫描二维码关注公众号,回复: 5817548 查看本文章

2、equals

      1、equals方法不能作用基本数据类型,除了(char,boolean,Double),

      2、equals方法比较的是引用类型的变量所指向的对象的地址(没有被重写过的),object类中的方法

             源码:

              该equals类方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值xy ,当且仅当xy引用相同的对象( x == y具有值true )时,该方法返回true

  • 自反性 :对于任何非空的参考值xx.equals(x)应该返回true
  • 它是对称的 :对于任何非空引用值xyx.equals(y)应该返回true当且仅当y.equals(x)回报true
  • 传递性 :对于任何非空引用值xyz ,如果x.equals(y)回报truey.equals(z)回报true ,然后x.equals(z)应该返回true
  • 它是一致的 :对于任何非空引用值xy ,多次调用x.equals(y)始终返回true或始终返回false ,没有设置中使用的信息equals比较上的对象被修改。
  • 对于任何非空的参考值xx.equals(null)应该返回false

          3、Integer,String,Date,Double等类会对equals方法重写(char没有被重写)

                    1、Integer重写的源码:

                              

                             观察源码,因为有.intValue()方法, 所以Integer比较的是值得大小

                              

                              结果是  true

                    2、String重写的源码:

                                   

                              观察源码可知道,先比较地址,地址一样的话返回true,地址不一样的话 转换成char数组来比较值。

                              所以当值相同的话会返回true。

                      3、Double重写的源码:

                             

                                观察源码可以知道,比较的是值的大小。

                    4、char的源码:

                             

                             char类型是特例,它比较的是 地址。 

                         

                             运行结果:

                                            

猜你喜欢

转载自blog.csdn.net/weixin_40879743/article/details/88979281