关于重写equals必须重写hashcode

文章通过一个Java代码示例解释了即使两个对象的hashCode相等,它们并不一定相等。当equals方法重写正确时,两个相等的对象其hashCode必须相等。在使用HashMap时,不正确的重写可能导致意外的行为。
摘要由CSDN通过智能技术生成

直接上代码吧
hashcode相等,对象不一定相等
两个对象相等,hashcode一定相等

public class Test{
	Integer age;
	String name;
		
	public static void main(String[] args) {
		Test t1 = new Test(18,"aaa");
		Test t2 = new Test(18,"aaa");
		System.out.println(t1.equals(t2)); // true
		System.out.println(t1 == t2); //false

		//到这里都还没问题,完全可以不用重写equals
		Map<Test,String> map = new HashMap();
		map.put(t1,"aaa");
		map.put(t2,"ccc");
		System.out.println(map.get(t1)); 
		/**
			如果重写了hashcode ,那么t1.hashcode() == t2.hashcode()
			 System.out.println(map.get(t1));  // ccc
			如果没重写,那么输出aaa
		**/
	}

	public Test(Integer age,String name) {
		this.age = age;
		this.name = name;
	}
	
	@Override
	public boolean equals(Object obj){
		if(obj == null) return false;
		if(this == null) return false;
		if(getClass() != obj.getClass()) return false;
		Test test = (Test) obj;
		if(age != test.age) return false;
		if(name == null) {
			if(test.name == null){
				return false;
			}
		}else if (!name.equals(test.name)) {
			return false;
		}
		return true;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值