equals和hashcode重写的问题

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码一样
	}

  

原文地址:https://www.cnblogs.com/liyong888/p/7703738.html