String类的hashcode:
需要说明一下的是:如果没有调用过hashCode(),那么hash的值为0。容易知道这里的value也就是真正保存的字符串的值(也就是“字符串测试”)的char数组,而每个char的值是多少呢?很容易验证:Unicode。
public final class String { private final char value[]; // 保存的字符串 private final int offset; // 开始的位置 private final int count; // 字符数目 private int hash; // 缓存的hash值 public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; } }
重写Object中的hashcode方法:
@Override public int hashCode(){ final int prime = 31; int result = 1; result = result*prime+id; //id是int型,没有hashcode方法 result = prime*result+((name==null)?0:name.hashCode());//name是String类型,有hashcode方法 return result; }