hashCode和equals方法

重写equals方法,必须重写hashCode方法。

个人现在的理解是这样的:
根据hashMap或者hashTable这些用hash存储和取值的collection,以hashMap为例, HashMap<K, V>, 1.  先调用K对象的hashCode方法取得hash值,2. 然后去map里查找,3. 每个到一个对应hash值,4. 跟当前的K对象比较,5. 如果相等,则取出V,6. 否则查下一个!
问题就在:如果没有override hashCode方法, 1.的时候如果是一个new obj,这个obj是equals K的,但是它的hash值肯定不会跟原来那个相等,因为内存地址不同,所以hash值肯定会不同,就不能到K那里,取不到值。 所以两个obj如果equal,那么他们hashCode必须相等!
关于怎么override, 感觉就是拿obj里特有的东西做hash就可以了,如果想效率高点可以乘以17或31什么的。 比如public PhoneNumber(int areaCode, int prefix, int lineNumber), 可以分别拿这三个field*31, 然后相加作为hashCode。
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s