<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>jaspernote Blog</title>
        <link>https://your-docusaurus-site.example.com/jaspernote/blog</link>
        <description>jaspernote Blog</description>
        <lastBuildDate>Fri, 15 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[concurrenthashmap 中的位运算]]></title>
            <link>https://your-docusaurus-site.example.com/jaspernote/blog/concurrenthashmap 中的位运算</link>
            <guid>https://your-docusaurus-site.example.com/jaspernote/blog/concurrenthashmap 中的位运算</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">当数组长度 n 是 2 的幂（如 16, 32, 64）时，存在一个数学公式：hash % n == hash &amp; (n - 1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">位运算 &amp; 的执行效率远高于取模运算 %</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">在哈希表中，我们计算一个 key 的桶位 index，公式是 hash &amp; (n - 1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">假设原来的容量 n = 16（二进制：0001 0000），那么 n - 1 = 15（二进制：0000 1111）。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">当容量翻倍变成 2n = 32 时， 2n - 1 = 31（二进制：0001 1111）。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">对比新旧掩码的变化：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- 老掩码 (15)：0000 1111</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- 新掩码 (31)：0001 1111</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">新掩码只比老掩码多了一个二进制位（即第 5 位，也就是 n对应的那个 1）。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">因此，一个节点在新数组的位置，完全取决于它的 hash 值在这一高位上是 0 还是 1：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">如果这一位是 0：新位置和老位置一模一样（低位）。如果这一位是 1：新位置 = 老位置 + n（高位）。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">如果一个 key 的 hash 值是 21，在老容量为 16 的时候，扩容后它就会被分到高位链表，搬去 原索引 + 16 的新位置</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">21 &amp; 16 = 16</span><br></div></code></pre></div></div>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* 生成一个能代表“当前正在进行 n 容量扩容”的唯一stamp</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* chm的容量肯定是2^n </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* 每一个不同的capacity 前导数(int 32 从左边最高位开始，到第一个1前面有多少个0)肯定不一样 </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* 就能确定是那一次（16-32）的扩容</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* 1 向左移15位   确保合并后的低 16 位结果中，最高位一定不是 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* n = 16  lz = 27     11011 | 1000 0000 0000 0000 = 1000 0000 0001 1011 </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* 1 向左移15位   确保合并后的低 16 位结果中，最高位一定不是 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">* 1 负数正在扩容 领先0 原来的容量</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">resizeStamp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> n</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">Integer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">numberOfLeadingZeros</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">n</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">RESIZE_STAMP_BITS</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//============================== helpTransfer 中：</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 在次&lt;&lt; 16位 给整数32位 高16位存储resziestamp 最后结果一定是负数，正在扩容中</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 低16位 参与扩容的线程数</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> rs </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">resizeStamp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tab</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">length</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">RESIZE_STAMP_SHIFT</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 扩容线程达到上限 </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// rs+1: 当一个线程发起扩容时 addCount: U.compareAndSetInt(this, SIZECTL, sc, rs + 2)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// +2 : 第一个1 代表正在扩容 第二个1 代表 当前有一个线程进行扩容</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 当sc == rs+1 代表扩容已经完成了</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 扩容任务分配器：64 -48 thread a：[48,63] 减到0就说明已经迁移完成了</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sc </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> rs </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">MAX_RESIZERS</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> sc </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> rs </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              transferIndex </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">U</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compareAndSetInt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SIZECTL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sc </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token function" style="color:#d73a49">transfer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tab</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nextTab</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> nextTab</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">//如果低位是 0，可能会和某些初始化状态混淆</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 当前线程发起扩容 +1 resize 标记 +1 当前线程</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">U</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compareAndSetInt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SIZECTL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rs </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token function" style="color:#d73a49">transfer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tab</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                s </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sumCount</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//==============================  transfer中：</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 扩容完成之后 sziectl = n*2 - n/2 = 0.75n 避免浮点数的运算</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sizeCtl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">n </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">n </span><span class="token operator" style="color:#393A34">&gt;&gt;&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[nvim-keymap]]></title>
            <link>https://your-docusaurus-site.example.com/jaspernote/blog/nvim-keymap</link>
            <guid>https://your-docusaurus-site.example.com/jaspernote/blog/nvim-keymap</guid>
            <pubDate>Thu, 16 Apr 2026 09:59:26 GMT</pubDate>
            <description><![CDATA[snack]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="snack">snack<a href="https://your-docusaurus-site.example.com/jaspernote/blog/nvim-keymap#snack" class="hash-link" aria-label="Direct link to snack" title="Direct link to snack" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="explore">explore<a href="https://your-docusaurus-site.example.com/jaspernote/blog/nvim-keymap#explore" class="hash-link" aria-label="Direct link to explore" title="Direct link to explore" translate="no">​</a></h3>
<p>]g [g   jump to next/previous git change
ctrl+t 在当前路径打开terminal</p>]]></content:encoded>
        </item>
    </channel>
</rss>