散列与散列表

对于HashMap使用自定义类作为键时,必须重载hashcode()和equals()方法

默认的Object.equals()的实现是“==”比较,比较对象的地址是否相同,相同则为同一对象,结果为true,但子类都会覆写equals方法,像String类就对equals方法进行了重写,其实现是比较两者字符串内容是否相同,相同则为true。

默认的Object.hashcode()默认是使用对象的地址计算散列码,但子类的实现都是基于对象的内容生成散列码,内容相同的对象有相同的散列码。

例如对于String而言,hashcode()是基于String的内容的,内容equals,则hashcode相同


 设计hashCode()时最重要的因素就是:无论何时,对同一个对象调用hashCode()都应该产生同样的值。如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,而用get()取出时却产生了另一个hashCode值,那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,用户就要当心了,因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码”。----java编程思想

在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。一个对象只有一个hashcode值,不能因为内部数据变化而改变hashcode。

如果两个对象根据equals方法比较是相等的,那么调用两个对象的hashCode方法必须返回相同的整数结果。

如果两个对象根据equals方法比较是不等的,则hashCode方法不一定得返回不同的整数。


两个对象相同 并不一定等于 两者为同一对象。

对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;

如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同;

如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;

如果两个对象的hashcode值相等,则equals方法得到的结果未知



猜你喜欢

转载自blog.csdn.net/qq_32231495/article/details/80324209