谈谈自己对于hashcode和equals的理解

一直以来,对于hashcode都只停留在知道的层面。只知道机械性的背诵:
可能hashcode相同但是equals不相同,不过equals相同hashcode一定相同。
重写equals一定重写hashcode。
今天再去学习的时候,突然有了自己新的理解,在这里记录一下。
首先,hash是一种算法,而hashcode就是通过这种算法算出的值,有一个对应的表叫做hash表。
举个例子,就是有懂大楼叫做hash表,每个对象就是不同的住户,而hashcode就是大楼的楼层,也就是对应的hash表中的值。
当有一个对象要进行存储,也就是有新住户要入住,首先通过hash算法计算出他要入住哪层楼,也就是算出他的hashcode,然后去看那一层楼里他是不是已经入住过了,也就是比较值是否相同,如果没有相同的,那他就顺利入住了。
然后回到上面的那两句话,首先是第一句。有了上面的例子就很好理解了。hashcode一样只能征明你们住在同一层,不能征明你们就是同一个人。但是equals代表你们是同一个人,那么你们肯定住在同一楼里面。
至于重写也很好理解,就是说你搬家了,不管是不是还在同一栋楼里,物业都会对你的住址进行重新登记。

写到这里我想起了一个很有趣的例子。
代码是这样的:

String a = "name";
String b = "name";
System.out.println(a.equals(b));
System.out.println(a==b);
System.out.println(a.hashCode());
System.out.println(b.hashCode());

运行结果如下:
在这里插入图片描述
将代码稍微修改一下:

String c = new String("111");
String d = new String("111");
System.out.println(c==d);
System.out.println(c.equals(d));
System.out.println(c.hashCode());
System.out.println(d.hashCode());

运行结果如下:
在这里插入图片描述
从中很明显的可以看到,当两个对象的equals是为true的时候,他们的hashcode一定是一样的,不管是用何种方式创建的。唯一的区别在两个对象的比较上。
第一种之所以为true,是因为"name"是一个字符串,他被直接在常量池中创建,当创建b这个对象的时候,因为常量池中已经有"name"了,所以就不再创建,直接引用了,所以a和b都是引用的常量池中的"name",所以是true。
但是第二种情况就不一样了,c和d都是通过new String()创建的对象,他们是两个值一样的对象,所以为false

猜你喜欢

转载自blog.csdn.net/NewBeeMu/article/details/113045544