为何该Java HashMap程序两次get结果均为m?求内部运行原理
为什么这段HashMap代码输出两次"m"?
import java.util.HashMap; class HelloWorld { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); String s1=new String("ankit"); String s2=new String("ankit"); String s3=new String("ankit"); // Adding elements to the Map // using standard put() method map.put(s1, "i"); map.put(s2, "m"); System.out.println(map.get(s1)); System.out.println(map.get(s3)); } }
这段代码的核心在于HashMap判断键相等的规则,以及String类对equals()和hashCode()的重写:
- 虽然
s1、s2、s3是三个内存地址不同的对象,但它们的字符串内容完全一致。 - HashMap的
put()方法执行逻辑:- 先计算键的
hashCode值,找到对应的哈希桶; - 遍历该哈希桶内的元素,用
equals()方法比较键是否相等。
因为String的hashCode()是基于字符串内容生成的,所以s1和s2的哈希值完全相同;同时String的equals()是比较内容而非地址,所以s2和s1会被判定为相等。这时候HashMap会认为是同一个键,用新值"m"覆盖掉之前的"i"。
- 先计算键的
- 调用
get()方法时逻辑和put()一致:map.get(s1)和map.get(s3)都会因为哈希值相同、内容相等,匹配到同一个键,最终返回覆盖后的"m"。
总结来说:HashMap不认对象的内存地址,只认键的hashCode和equals结果,只要这两个条件都满足,就视为同一个键,后续put的新值会覆盖旧值,get时也会返回同一个值。
内容的提问来源于stack exchange,提问作者Ashok Ogirala
相关产品推荐
相关产品推荐

