随手记0x02

本文最后更新于:5 天前

字符串的hashCode

String类型,只要值相同,那么hashCode一定相同。

1
2
3
4
5
6
7
8
public static int hashCode(byte[] value) {
int h = 0;
int length = value.length >> 1;
for (int i = 0; i < length; i++) {
h = 31 * h + getChar(value, i);
}
return h;
}

这里是String hashCode的源码,其中value是String类内部维护的字符数组。

可以看出,字符数组的值一样,则hashCode就相同。

即equals方法相同的两个String,hashCode一定相同。

所以这里应用了散列?

Objects.hash()方法

当我们自定义类,想要重写hashCode方法时,可以通过Objects.hash()来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Employee
{
private String name;
private int age;

Employee(String name, int age){
this.name = name;
this.age = age;
}

@Override
public int hashCode(){
// return name.hashCode() + age;
return Objects.hash(name, age); //这里就很方便了
}

@Override
public boolean equals(Object o){
if(o == null)
return false;
if(o instanceof Employee){
Employee e = (Employee) o;
return this.name.equals(e.name) && this.age == e.age;
} else {
return false;
}
}

@Override
public String toString(){
rturn name + " " + age;
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!