hash hashcode变化_hashmap重写key的hashcode问题

今天看到这样一个问题:

/**补充完该类,不修改main方法,使得get()方法可以取到值*/

package test;

import java.util.HashMap;

import java.util.Map;

public class StudentTest {

private static final class Student {

private static String name;

public Student(String name) {

this.name = name;

}

}

public static void main(String[] args) {

Map p = new HashMap();

p.put(new Student("lily"), "sister");

System.out.println(p.get("lily"));

System.out.print(p.keySet().iterator().next());

}

}

测试发现重写student的hashcode也不能重现,本以为hashmap只通过hash后的index作为寻找value的策略,结果还是不行

看源码get方法发现下面,

static class Entry implements Map.Entry {

final K key;

V value;

Entry next;

int hash;

/**

* Creates new entry.

*/

Entry(int h, K k, V v, Entry n) {

value = v;

next = n;

key = k;

hash = h;

}

key除了通过hash比较,还要比较本身key和查询key,下面的代码展示Entry除了要记录hash还要记录hash时的Key(object类型)

final Entry getEntry(Object key) {

if (size == 0) {

return null;

}

int hash = (key == null) ? 0 : hash(key);

for (Entry e = table[indexFor(hash, table.length)];

e != null;

e = e.next) {

Object k;

if (e.hash == hash &&

((k = e.key) == key || (key != null && )))

return e;

}

return null;

}

总结:

对于hashcode,一般是不推荐重写的,而hashcode本身也是为了对于hashmap这类需要使用hash算法的对象而产生的,如果非要按照自己的需求去实现key,value映射,必须要修改Hashmap中的get等方法,单纯修改key的hashcode算法是不够

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值