-
== 与 equals()
对象中 == 与 equals() 比较的都是内存地址,重写equals()可实现比较对象中的值。
源码如下:public boolean equals(Object obj) { return (this == obj); }
String对象中,equals()是值的比较,因为String重写了equals()。
源码如下:public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
问:== 比较的是内存地址,为什么String中的 == 比较的是值?
答:String中的 == 比较的也是内存地址,String创建对象有两种方式,分别为通过new创建和直接赋值。new出来的情况下, == 比较的就是内存地址,毋庸置疑,到了这里就能证明String中 == 比较的不是值;那么直接赋值的情况呢,常量是程序初始化的时候就存在于方法区中,常量不重复存在,举个例子:public static void main(String[] args) { String a = "string"; String b = "string"; System.out.println(a == b); }
程序初始化的时候,第一个“string”被创建,执行到第二个“string”的时候,由于方法区中已经存在,所以不重复创建,也就是说a、b指向的是同一个“string”,内存地址相等,结果返回true
-
equals() 与 hashCode()
问:重写equals()必须重写hashCode()吗?
答:不是,需要用到hashCode()的时候才需要重写,如hashMap等,有一位博主写的通俗易懂,上链接:
帮你搞懂Java中重写equals方法为什么要重写hashcode方法?
一般,重写了equals()都要重写一下hashCode(),避免概念混淆。 -
hashCode()与内存地址
问:重写hashCode()之后多个只是值相同的对象共用同一个内存地址了?
答:不是的,hashCode()默认返回内存地址,但重写之后,返回的不再是内存地址,只是一个hash值;System.identityHashCode(Object)才是获取真正的内存地址方法,所以重写hashCode()并不会修改内存地址。