public static void main(String[] args) { Set<Test> set = new HashSet<>(); Test t1 = new Test("aaa"); Test t2 = new Test("aaa"); set.add(t1); set.add(t2); System.out.println(set.size()); //我们对于equals方法已经很熟了,这里就不说了 //t1.equals(t2) == true //如果Test没有重写hashcode方法 set.size() -> 2 //如果Test重写了hashcode方法 set.size() -> 1 //原因: //在集合中,判断两个对象是否相等的规则是: //第一步,如果hashCode()相等,则查看第二步,否则不相等; //第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等 //hashcode源码分析:String类的 //实际上它是遍历了字符串的里面的所有字符,根据每个字符的ASCII码值进行遍历计算,关于那个固定值为什么是31,应该取这个值效率较高,可重复性较低 /*public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h;*/ //equals源码分析:string类 //这个相信大家都看过,遍历字符串里的所有字符,然后逐一进行比较,只要有不相同的就return false //所以 //equals相同的两个对象,其hashcode码一定相同,因为hashcode码就是根据值去算的 //两个对象的hashcode码相同,可能存在偶然的情况,字符串不同,算出的hashcode码一样 }