Java-HashCode

Java-HashCode

1. Equals和==的区别

== 仅在相比较的对象就是自己本身时,才返回 true。而 equals 是 Object 类中的方法,其返回值可以根据需求定义,默认情况下,equals 返回的也是 == 的值,但在像 HashMap、Array 中等则会返回 key 或 value 是否相等。

由于 String 和常数是存放在常量池,因此直接比较 String 的值时,相同的字符串两个都会返回 true,例如:

1
2
3
4
5
6
7
8
9
10
11
12
String sa = "123";
String sb = "123";
String sc = new String("123");
String sd = new String("123");

sa == sb return true;
sa.equals(sb) return true;

sc == sd return false;
sc.equals(sd) return true;

42 == 42.00 return true;

2. 为什么要同时重写equals()和hashcode()

默认情况下,equals比较的是两个对象的内存地址是否相等,重写equals 方法通常是转换成比较值是否相等,如果重写了equals方法而不重写hashcode方法,默认情况下hashcode是根据对象的内存地址计算的,则可能出现equals为true而hashcode不相等的情况,这和hashcode的本意是不符的。HashCode不相等的两个对象一定不相等,相等的两个对象HashCode一定向等。

(1)为什么要有HashCode方法?

可以根据HashCode来判断两个对象是否相等,而不需要依次比较equals。switch判断String时,判断的是hashCode。

(2)hash算法的原理是什么?

(3)在Java中哪些地方用到了HashCode?