1.問題來源
最近想看看JDK源碼,在看Object.hashCode()方法時,突然遺忘了java對漢字的hash處理,於是想總結下這個簡單的問題。
2.代碼分析
· 附上一個漢字轉ASSCII碼的代碼
public class ChineseToAss {
public static void main(String[] arg) {
String str = "王";
char[] chinese = new char[str.length()];
chinese = str.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < chinese.length; i++) {
System.out.print((int) chinese[i] + " ");
sb.append((int) chinese[i] + ",");
}
}
}
可以看出"王"的ASSCII碼值爲29579
3.本人學習時的誤解
public class Clone {
public static void main(String[] agv){
Student student1 = new Student("小王", 20);
System.out.println("王".hashCode());
}
}
class people{
private Integer tall;
public Integer getTall() {
return tall;
}
public void setTall(Integer tall) {
this.tall = tall;
}
}
class Student extends people{
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Student)) {
return false;
}
Student student = (Student) o;
return Objects.equals(getName(), student.getName()) &&
Objects.equals(getAge(), student.getAge());
}
@Override
public int hashCode() {
return Objects.hash(getName(), getAge());
}
在第5行的斷點調試中起初沒有意識到漢字的ASCII碼,導致糾結浪費了快半小時;
4.總結
1.Java漢字在計算hashcode時會轉化爲ASCII碼,然後和普通字符一樣,每次乘以31累加;