<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>编程错题集 on 洛克里亚的五度 博客</title>
    <link>https://lv-blog.pages.dev/tags/%E7%BC%96%E7%A8%8B%E9%94%99%E9%A2%98%E9%9B%86/</link>
    <description>Recent content in 编程错题集 on 洛克里亚的五度 博客</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Mon, 07 Sep 2026 22:51:12 +0800</lastBuildDate>
    <atom:link href="https://lv-blog.pages.dev/tags/%E7%BC%96%E7%A8%8B%E9%94%99%E9%A2%98%E9%9B%86/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>我的错题集</title>
      <link>https://lv-blog.pages.dev/posts/programming/%E6%88%91%E7%9A%84%E9%94%99%E9%A2%98%E9%9B%86/</link>
      <pubDate>Mon, 07 Sep 2026 22:51:12 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/%E6%88%91%E7%9A%84%E9%94%99%E9%A2%98%E9%9B%86/</guid>
      <description>&lt;h2 id=&#34;javaequals-与-hashcodehashmap&#34;&gt;Java：&lt;code&gt;==&lt;/code&gt;、&lt;code&gt;equals()&lt;/code&gt; 与 &lt;code&gt;hashCode()&lt;/code&gt;（HashMap）&lt;/h2&gt;
&lt;h3 id=&#34;我的理解偏差&#34;&gt;我的理解偏差&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;把 &lt;code&gt;==&lt;/code&gt; 只理解成“比较引用地址”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这只适用于引用类型。&lt;/li&gt;
&lt;li&gt;对基本数据类型，&lt;code&gt;==&lt;/code&gt; 比较的是值。&lt;/li&gt;
&lt;li&gt;对引用类型，&lt;code&gt;==&lt;/code&gt; 判断两个引用是否指向同一个对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;把 &lt;code&gt;equals()&lt;/code&gt; 说成“判断是不是同一个对象”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更准确的说法是：&lt;code&gt;equals()&lt;/code&gt; 用于判断两个对象是否“逻辑相等”。&lt;/li&gt;
&lt;li&gt;两个不同的对象，也完全可以因为业务字段相同而 &lt;code&gt;equals() == true&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;把 &lt;code&gt;hashCode()&lt;/code&gt; 理解成可以直接定位到某个对象&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hashCode()&lt;/code&gt; 主要用于散列查找，帮助 HashMap 快速缩小查找范围、定位桶。&lt;/li&gt;
&lt;li&gt;不同对象可能拥有相同的 hashCode，因此 hashCode 不能唯一确定一个对象。&lt;/li&gt;
&lt;li&gt;HashMap 找到桶后，还需要通过 &lt;code&gt;equals()&lt;/code&gt; 进一步确认 key。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“重写 equals 必须重写 hashCode”的关键原因没有说完整&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 约定：如果 &lt;code&gt;a.equals(b) == true&lt;/code&gt;，则必须保证 &lt;code&gt;a.hashCode() == b.hashCode()&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在 HashMap 中，如果两个逻辑相等的 key 因为 hashCode 不同被定位到不同的桶，那么查找时连 &lt;code&gt;equals()&lt;/code&gt; 都可能没有机会执行，最终导致本应相等的 key 查找失败。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;核心记忆&#34;&gt;核心记忆&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;hashCode()&lt;/code&gt; 负责“找桶”，&lt;code&gt;equals()&lt;/code&gt; 负责“认人”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;如果 &lt;code&gt;equals()&lt;/code&gt; 相等但 &lt;code&gt;hashCode()&lt;/code&gt; 不同，两者可能被放进不同的桶，甚至没有机会进行 &lt;code&gt;equals()&lt;/code&gt; 比较。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
