You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该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()方法执行逻辑:
    1. 先计算键的hashCode值,找到对应的哈希桶;
    2. 遍历该哈希桶内的元素,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:18:31