使用HashMap<Integer, MyObject>时,Integer作为键是否安全?put与get行为一致吗?
嘿,这个问题问得相当实在!用Integer作为HashMap<Integer, MyObject>的键完全安全,而且put和get的行为也能保持高度一致,下面给你唠明白细节:
为什么Integer做HashMap键安全?
- 不可变性兜底:
Integer是Java里的不可变类,一旦创建完成,它的数值就再也没法被修改。HashMap对键的核心要求就是hashCode和equals的稳定性——要是键存进去之后变了,后续就根本找不到对应的值了。而Integer的hashCode就是它本身的int值(看源码就知道:public int hashCode() { return value; }),永远不会变,完美符合要求。 - equals与hashCode完全匹配:Integer的
equals()方法是实打实基于数值比较的,和hashCode的逻辑完全对齐。只要两个Integer的数值相同,它们的hashCode就一致,equals也会返回true,这刚好踩中HashMap判断键相等的逻辑(先比hashCode定位桶,再用equals确认)。
put和get的行为一致性
只要你用的是数值相等的Integer作为put和get的键,两者的行为绝对是一致的,举几个日常开发的场景:
- 直接使用Integer对象:
Integer key1 = new Integer(100); Integer key2 = new Integer(100); HashMap<Integer, MyObject> map = new HashMap<>(); map.put(key1, new MyObject()); MyObject obj = map.get(key2); // 稳稳能拿到值,因为key1和key2数值相等,equals返回true - 自动装箱(最常用的写法):
HashMap<Integer, MyObject> map = new HashMap<>(); map.put(100, new MyObject()); // 自动把int转成Integer对象 MyObject obj = map.get(100); // 同样自动装箱,能精准取出对应值
这里提个小细节:Integer有个-128到127的缓存池,比如Integer a = 100和Integer b = 100是同一个对象,但哪怕超出这个范围(比如200),两个不同的Integer对象只要数值相同,equals和hashCode依然一致,完全不影响put和get的匹配,所以根本不用纠结这个缓存池的问题。
要避开的小坑
- 关于null键:HashMap允许键为null,但如果用
get(null)返回null后直接拆箱成int,会直接抛NullPointerException(比如int val = map.get(null);就会炸),所以如果可能存null键,记得先做非空判断。 - 别试图修改Integer的值:当然了,Integer是不可变的,你想改也改不了,这点完全不用操心。
总的来说,用Integer当HashMap的键是非常靠谱的选择,put和get的行为完全一致,只要保证键的数值相等,就能准确存取值。
内容的提问来源于stack exchange,提问作者xc93hil
相关产品推荐
相关产品推荐

