HashMap问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 17:36:12
怎么判断HashMap的键是相同的,比如我的key是个对象,该对象重写了equals和hashCode函数,hashCode返回值永远为0,equals返回永远为false(也就是自己跟自己比也是false),
当map put 2个新new出来的对象a,b为key的键值对,是将2个a,b看作不同的key,当我想拿出其中一个key对应的value时,我会get(a);能找到匹配的值,我想不通的是,map怎么知道我传进去的a就是map保存的key a.

找不找得出来我认为这与 equals和hashCode没有关系吧/ 无论你怎么复写这两个方法 map也会找出来。
hashCode只会影响put ,get速度而已
equals 是在put时 自动调用对象的equals方法 来去找map中是不是已经这个对象了。。
如果有equals返回了false 那么就会按hashCode方法生成值做参考位置放这个对象。(这个值是怎么生成的,据说有还有一门hash学,我们先不用考虑。)。如果这个位置有了就依此向后放
取出时也这样。

如果这种用法用hashMap没意义了

------------------------------------------------------------------
// 在hashMap 的get方法中 对key的引用也做为了比较条件
public V get(Object key)
{
if(key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for(Entry<K, V> e = table[indexFor(hash, table.length)]; e != null; e = e.next)
{
Object k;
// hash值相相等 并且 ( 当前遍历到的key与传入key地址相同 或 值相等 )
if(e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}

你说的这种情况下如果经过序列化再反序列后就不会找到Value的值了
class Base implements Serializable
{
public String d;

public Base(String a)
{
d