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类型,如果不是无法比较,然后比较两个值是否相等。

浙公网安备 33010602011771号