网站推广与优化怎么做ps抠图教程

张小明 2026/3/2 21:29:02
网站推广与优化怎么做,ps抠图教程,江苏昆山网站建设,胶州网站开发首先先看看 hashmap 在 jdk1.8 下扩容的核心方法在 JDK 1.8 的 HashMap 源码中#xff0c;已经找不到 transfer 这个方法了。JDK 1.8 将扩容逻辑全部整合到了 resize() 方法中。而且#xff0c;为了配合新的“尾插法”和“位运算”优化#xff0c;这段代码的逻辑发生了翻天覆…首先先看看 hashmap 在 jdk1.8 下扩容的核心方法在 JDK 1.8 的HashMap源码中已经找不到transfer这个方法了。JDK 1.8 将扩容逻辑全部整合到了resize()方法中。而且为了配合新的“尾插法”和“位运算”优化这段代码的逻辑发生了翻天覆地的变化。如下是 JDK 1.8resize()方法中核心的数据迁移部分代码去掉了红黑树转换等干扰逻辑只看链表迁移// JDK 1.8 HashMap.resize() 的核心迁移逻辑片段 NodeK,V[] newTab (NodeK,V[])new Node[newCap]; // 1. 创建新数组 // 遍历旧数组 for (int j 0; j oldCap; j) { NodeK,V e; if ((e oldTab[j]) ! null) { // 如果这个位置有数据 oldTab[j] null; // 把旧数组这个位置清空 if (e.next null) // Case 1: 只有一个节点直接算新位置放进去 newTab[e.hash (newCap - 1)] e; else if (e instanceof TreeNode) // Case 2: 红黑树的处理 (略) ((TreeNodeK,V)e).split(this, newTab, j, oldCap); else { // Case 3: 链表迁移 (核心重点) // 定义了两组头尾指针这就是“本地打包”的证据 NodeK,V loHead null, loTail null; // 低位链表 (留在原位) NodeK,V hiHead null, hiTail null; // 高位链表 (去 j oldCap) NodeK,V next; do { next e.next; // 【核心改变1】不需要重新取模 (hash % newCap) // 而是看最高位是 0 还是 1 if ((e.hash oldCap) 0) { // 最高位是 0放到“低位链表” if (loTail null) loHead e; else loTail.next e; // 【核心改变2】尾插法挂在当前尾巴后面 loTail e; // 更新尾巴指针 } else { // 最高位是 1放到“高位链表” if (hiTail null) hiHead e; else hiTail.next e; // 【核心改变2】尾插法 hiTail e; } } while ((e next) ! null); // 循环处理链表 // 【核心改变3】一次性写入新数组 if (loTail ! null) { loTail.next null; // 把尾巴封死防止非法连接 newTab[j] loHead; // 放入新数组原索引位置 } if (hiTail ! null) { hiTail.next null; // 把尾巴封死 newTab[j oldCap] hiHead; // 放入新数组 (原索引 oldCap) 位置 } } } }那么 jdk1.8 是如何解决死循环问题的呢根据上面的源码解决方案其实非常简单粗暴就是**“维持秩序”**。在 1.7 中死循环的根源在于线程 T2 把链表从A - B改成了B - A。 线程 T1 还在按A - B的顺序处理结果发现A的下一个变成了BB的下一个又变回了A于是转圈圈。在 1.8 中使用了尾插法loTail.next e;这一行代码保证了新加入的节点永远在屁股后面。T2 扩容完链表是A - B。T1 醒来继续扩容它顺着链表走看到的顺序依然是A - B。因为顺序没乱B 永远不会指向 A。最后loTail.next null这一行显式地把链表封口彻底杜绝了环的产生。还有一点变化 除了变“尾插法”之外“何时写入新数组”这个动作的时机也发生了根本性的变化。1. JDK 1.7 的做法搬一个扔一个 (即时写入)在 JDK 1.7 的transfer方法中处理链表是**“边拆边扔”**动作从旧箱子里拿出一个物品节点算一下新位置立刻把它扔进新箱子新数组newTable里。代码逻辑// 伪代码 while(遍历旧链表) { Entry next e.next; int i indexFor(e.hash, newCapacity); // 每一个节点处理完立刻修改新数组的内存 e.next newTable[i]; // 头插 newTable[i] e; // 写入新数组这里是并发隐患点 e next; }风险每次循环都在修改共享内存新数组并发环境下这相当于在“裸奔”极其容易产生竞争。2. JDK 1.8 的做法打包好了一次性搬 (延迟写入)在 JDK 1.8 的resize方法中处理链表是**“先分类打包最后一次性扔过去”**动作先把旧箱子里的物品全部拿出来过一遍。根据 hash 值在本地把它们分成两堆两个临时链表一堆是留在原索引位置的loHead/loTail。一堆是去新索引位置的hiHead/hiTail。循环结束了再一次性把这两堆链表的头节点挂到新数组的对应位置。代码逻辑// 伪代码 Node loHead null, loTail null; // 本地低位链表 Node hiHead null, hiTail null; // 本地高位链表 // 1. 先在本地循环构建链表 (不碰新数组) do { if (原位置) { loTail.next e; // 尾插到本地链表 loTail e; } else { hiTail.next e; // 尾插到本地链表 hiTail e; } } while (e e.next); // 2. 循环结束才去动新数组 (只写两次内存) if (loTail ! null) newTab[j] loHead; // 一次性挂上去 if (hiTail ! null) newTab[j oldCap] hiHead; // 一次性挂上去总结这种变化的意义这个“本地链表”机制实际上是使用了loHead/loTail等临时指针变量配合尾插法带来了两个巨大的好处减少了对共享内存新数组的写入次数1.7 是有多少个节点就写多少次新数组。1.8 是无论链表多长一个桶只写 1-2 次新数组。避免了中间状态的暴露1.7 搬运过程中新数组里处于“半成品”状态顺序颠倒、还在插其他线程更容易读到脏数据或通过引用关系形成环。1.8 在本地拼好之前新数组那个位置是空的或者旧的直到最后拼好了才“原子性”地挂上去虽然不是真正的原子操作但大大缩短了不一致的时间窗口。还有一个优化(e.hash oldCap)你可能注意到了源码里这一行if ((e.hash oldCap) 0)。 这也是 1.8 的一大亮点它利用了二进制的特性避免了昂贵的取模运算。假设oldCap是 16 (10000)newCap是 32 (100000)。扩容其实就是把二进制的高位多看一位。如果 hash 值的那个多出来的位是0元素就在原位 (j)。如果 hash 值的那个多出来的位是1元素就在原位 老容量 (j oldCap)。这就是为什么源码里会有loHead(Low原位) 和hiHead(High高位) 这两个链表的原因。这让扩容效率极大提升。总结JDK 1.8 通过尾插法保证了链表顺序物理上消灭了环形链表产生的土壤通过本地指针lo/hi list减少了对共享内存的写入频次。虽然HashMap在 1.8 依然是线程不安全的多线程put可能覆盖数据但至少不会把服务器 CPU 跑满了。JDK 1.7 vs JDK 1.8 的核心区别总结特性JDK 1.7 (transfer 方法)JDK 1.8 (resize 方法)插入方式头插法 (Head Insertion)新节点插在链表头部。尾插法 (Tail Insertion)新节点插在链表尾部。链表顺序倒置(A-B 扩容后可能变成 B-A)。保持原序(A-B 扩容后依然是 A-B)。计算位置重新 Hash需要执行indexFor(h, newCapacity)。位运算判断直接看hash oldCap是 0 还是 1。写入时机即时写入遍历一个节点就往新数组里塞一个。延迟写入先在本地拼好链表最后一次性挂到新数组。并发死循环存在链表倒置 竞争 环形链表。已解决链表顺序不变不会形成环。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

seo优化网站网站建设与推广实训报告册

解密nom解析器组合子:函数式编程的优雅实践指南 【免费下载链接】nom 项目地址: https://gitcode.com/gh_mirrors/nom/nom 在当今数据驱动的时代,高效解析复杂数据格式已成为开发者必备技能。nom解析器组合子作为Rust生态中的明星项目&#xff0…

张小明 2026/1/13 6:36:47 网站建设

焦作做网站推广中建招聘官网入口

人力资源系统革新,打造企业人才发展新引擎 在当今竞争激烈的商业环境中,企业的发展离不开优秀的人才。而人力资源系统作为企业管理人才的重要工具,其革新对于打造企业人才发展新引擎具有至关重要的意义。 一、传统人力资源系统的痛点 功能单…

张小明 2026/1/13 6:34:46 网站建设

pc网站建设需要提供哪些资料做网站海报

从零开始设计一个波形发生器:正弦、方波、三角波的实现艺术你有没有试过用一块STM32,外加几片外围芯片,亲手做出一台能输出纯净正弦波的信号源?这听起来像是实验室高端设备才有的功能,但实际上——只要掌握了基本原理&…

张小明 2026/1/13 6:30:44 网站建设

建设部网站如何下载文件利用养生网站做竞价引流

终极Markdown演示神器:3分钟创建专业幻灯片 【免费下载链接】marp The site of classic Markdown presentation writer app 项目地址: https://gitcode.com/gh_mirrors/ma/marp 还在为制作演示文稿而烦恼吗?Marp作为一款基于Markdown的动态幻灯片…

张小明 2026/1/13 6:24:41 网站建设

网站空间选择的主要原则有哪些wordpress postname

原子变量是一种在并发编程中用于实现线程安全、无锁(lock-free) 操作的特殊变量类型。它的核心特性是对它的单个读、写或修改操作是不可分割的(即原子的),从而在多线程环境中无需使用传统的互斥锁(如 synch…

张小明 2026/1/13 6:22:40 网站建设

淘宝网站网页图片怎么做的wordpress调取页脚文件

官宣定档!王牌班底打造古风美学盛宴。由新锐导演杨晨禹领衔执导,联合出品人王婉晨、总制片人孙萌倾力加持,制片人沈冬冬、于淼联袂操刀的古风短剧《双面公子我渡劫》正式定档!杨晨禹导演以其独树一帜的视觉叙事风格,精…

张小明 2026/1/13 6:20:39 网站建设