JAVA中的==与equals

在面试中遇到了这个问题,涉及到hashCode,整理归纳一下。

==:“==”的定义:

  • 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
  • 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

 

equals的定义:

equals是Object类的方法,Object类又是所有类的直接或间接父类,所以所有类都可以直接调用这个方法。那么先来看下Object的源码;

1  public boolean equals(Object obj) {
2         return (this == obj);
3 }

上面我们说过,==对于引用数据类型,比较的是对象在内存中存放的地址。也就是说,任何类在没有重写equals方法的前提下,调用equals方法时,会比较两个对象的内存地址是否相同,与直接使用==进行比较的过程完全一样。

 

那么对于一些基本数据类型中的equals方法,java是如何定义的呢?先来看下Double中的equals源码;

1     public boolean equals(Object obj) {
2         return (obj instanceof Double)
3                && (doubleToLongBits(((Double)obj).value) ==
4                       doubleToLongBits(value));
5     }
 1     public static long doubleToLongBits(double value) {
 2         long result = doubleToRawLongBits(value);
 3         // Check for NaN based on values of bit fields, maximum
 4         // exponent and nonzero significand.
 5         if ( ((result & DoubleConsts.EXP_BIT_MASK) ==
 6               DoubleConsts.EXP_BIT_MASK) &&
 7              (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)
 8             result = 0x7ff8000000000000L;
 9         return result;
10     }

可以看出比较的过程中涉及转换精度,在这里不细说。大致的比较逻辑为先判断被比较对象是否为Double类型,如果不是无法比较,然后比较两个值是否相等。

posted @ 2020-09-26 13:07  Vincent_9527  阅读(34)  评论(0)    收藏  举报