equals()和==的区别
两个都是用来比较值大小的:
- ==主要是用来比较两个引用是否指向堆内存的同一地址,equals(object)主要用来比较两个对象的值是否相同
- 基本数据类型使用==比较,使用equals()将编译失败
- 一般在对象中比较需要重写equals()方法,不然将导致使用object中的equals()方法,比较两个对象的指向地址是否相同
- *使用equals()方法需要重写hashcode()方法
一、String中的equals和==
@requires_authorization
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2)) System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
... prompt'''
---------------------
s1 != s2
s1 equals s2
第一个程序创建一个字符串s1会去缓冲池里面寻找,然后将地址指向缓冲池中,而通过new一个对象s2,会指向堆中一个地址,两个句柄指向不同的地址,所以使用==不相等,但是里面的内容是相等的,所以equals()方法相等。
二、hashCode
在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。
你想通过一个object的key来拿hashmap的value,hashmap的工作方法是,通过你传入的object的hashcode在内存中找地址,当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。
所以这里要匹配2部分,hashcode和equals但假如说你new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode,你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的hashcode来找到key的地址,然后你要重写你的equals方法,使内存中的内容也相等。。。