1. hashCode()
hashCode()用于返回对象的哈希码(又称散列码),hashCode代表的值是对象在hash表中的位置(并不是内存地址)
1.如果两个对象相等,则他们必须有相同的哈希码。
2.如果两个对象又相同的哈希码,则他们未必相等。
//代码示例
public class HashCodeMethod {
public static void main(String[] args) {
String str1 = "hashCode";
System.out.println("str1.hashCode() = " + str1.hashCode());
Person person = new Person();
System.out.println("person.hashCode() = " + person.hashCode());
}
}
2.equals()
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
可以看出equals()就是用'=='来进行比较的,其实比较的就是内存地址。若obj1.equals(obj2)为true,则说明obj1和obj2引用的是同一个对象
public class EqualMothod {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
Person person3 = person1;
System.out.println(person1.equals(person2));
System.out.println(person1.equals(person3));
}
}
String中重写equals()方法
String中重写了equals()方法,所以比较的是值而不是地址
public class EqualMothod {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
String str3 = "ab";
System.out.println("str1.equals(str2) = " + str1.equals(str2));
System.out.println("str1.equals(str3) = " + str1.equals(str3));
}
}
1.如果是基本类型的比较,只能用'==',而不能用equals()方法。
2.对于包装类型的比较,'=='是比较地址的,而equals()是比较内容的
3.hashCode()与equals()
Object类提供的equals()方法默认使用==进行比较,也就是说只有两个对象是同一个对象时,才能返回相同的结果。而实际的业务中,我们通常的需求时:若两个不同的对象他们的内容是相同的,就认为他们相等。鉴于这种情况,Object中的equals通常是没有实用价值的,所以通常需要重写,由于hashCode() and equals() 具有联动联系,所以两个方法需要同时重写以满足相关的约定。
equals方法和hashCode方法如果不同时按你自己逻辑覆盖的话,HashMap就会出问题。比如你只覆盖了equals方法而没有覆盖hashCode方法,那么HashMap在第一步寻找链表的时候会出错,有同样值的两个对象Key1和Key2并不会指向同一个链表或桶,因为你没有提供自己的hashCode方法,那么就会使用Object的hashCode方法,该方法是根据内存地址来比较两个对象是否一致,由于Key1和Key2有不同的内存地址,所以会指向不同的链表,这样HashMap会认为key2不存在,虽然我们期望Key1和Key2是同一个对象;反之如果只覆盖了hashCode方法而没有覆盖equals方法,那么虽然第一步操作会使Key1和Key2找到同一个链表,但是由于equals没有覆盖,那么在遍历链表的元素时,key1.equals(key2)也会失败(事实上Object的equals方法也是比较内存地址),从而HashMap认为不存在Key2对象,这同样也是不正确的。