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累加;