重写equals和hashcode的意义
1、为什么要重写equals
重写之后比较的是自己定义的属性值,而不是地址值
例:两个对象的地址不同但是属性相同,逻辑上我们认为这是同一个对象,但是比较的时候比较的是地址信息。结果不相同
2、为什么重写equals之后需要重写hashcode方法
例:两个对象的地址不同但是属性相同,如果实在集合别的地方使用无所谓,但是在hashset使用的时候会在逻辑上破坏hashset的特性。
例:
Ch ch = new Ch();
ch.setName("JAVA");
Ch ch1 = new Ch();
ch1.setName("JAVA");
HashSet<Ch> ches = new HashSet<>();
ches.add(ch);
ches.add(ch1);
System.out.println("ches = " + ches);
结果:
ches = [Ch(name=JAVA), Ch(name=JAVA)]
Process finished with exit code 0
逻辑上我们认为ch和ch1应该是一个对象只存储一次,但是调用equals的时候和hashcode的结果返回的不一致,hashset会认为这是两个不等的对象。所以会存储两次。不会去重!!!!!!