当前位置: 首页 > news >正文

做网站的ui安嶶省城乡建设网站

做网站的ui,安嶶省城乡建设网站,页面置换算法课程设计,分析网站建设发展措施Java中的HashMap是我们在开发中经常使用的集合之一#xff0c;它提供了基于哈希表的数据存储方式#xff0c;使得对数据的插入、删除和查找操作都具有较高的效率。在本文中#xff0c;我们将深入解析HashMap中的putVal方法#xff0c;揭示其内部工作原理。通过对代码的逐行…Java中的HashMap是我们在开发中经常使用的集合之一它提供了基于哈希表的数据存储方式使得对数据的插入、删除和查找操作都具有较高的效率。在本文中我们将深入解析HashMap中的putVal方法揭示其内部工作原理。通过对代码的逐行分析我们不仅能够更好地理解HashMap的设计和实现还能提高我们在实际开发中对HashMap的使用水平。 一、方法概述 putVal方法是HashMap中的核心方法之一主要用于向HashMap中插入键值对。它的签名如下 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict)参数说明 hash键的哈希值。key键。value值。onlyIfAbsent是否仅在键不存在时才插入。evict是否在插入后进行驱逐操作。 该方法的返回值是插入前与键关联的旧值如果没有旧值则返回null。 二、代码详细分析 下面我们将对putVal方法的每一部分进行详细的分析。 1. 初始化table HashMap.NodeK, V[] tab; HashMap.NodeK, V p; int n, i; if ((tab table) null || (n tab.length) 0)n (tab resize()).length;在这段代码中首先定义了局部变量tab、p、n和i。接着检查table是否为空或长度为0。如果是则通过resize()方法进行初始化。这一步确保了HashMap的底层数组table已经被初始化且具有一定的容量。 2. 计算索引并插入新节点 if ((p tab[i (n - 1) hash]) null)tab[i] newNode(hash, key, value, null);这里通过 (n - 1) hash 计算出键值对应该插入的索引位置并检查该位置是否为空。如果为空直接在该位置创建一个新的节点。值得注意的是为什么使用 (n - 1) hash 而不是 n hash。因为 (n - 1) 能确保结果在 0 到 n-1 之间正好是数组的有效索引范围。 3. 处理哈希冲突 else {HashMap.NodeK, V e;K k;if (p.hash hash ((k p.key) key || (key ! null key.equals(k))))e p;else if (p instanceof HashMap.TreeNode)e ((HashMap.TreeNodeK, V) p).putTreeVal(this, tab, hash, key, value);else {for (int binCount 0; ; binCount) {if ((e p.next) null) {p.next newNode(hash, key, value, null);if (binCount TREEIFY_THRESHOLD - 1)treeifyBin(tab, hash);break;}if (e.hash hash ((k e.key) key || (key ! null key.equals(k))))break;p e;}}if (e ! null) {V oldValue e.value;if (!onlyIfAbsent || oldValue null)e.value value;afterNodeAccess(e);return oldValue;} }这部分代码处理哈希冲突的情况。哈希冲突发生时同一个索引位置可能会有多个节点。为了处理这些节点HashMap使用了链表和红黑树两种数据结构。 覆盖旧值首先检查当前节点的哈希值和键是否与待插入的键值对相同。如果相同直接进行覆盖。红黑树节点如果当前节点是红黑树节点通过putTreeVal方法处理。链表节点如果是链表节点通过遍历链表找到适当的位置插入新节点。如果链表长度超过阈值默认是8会将链表转换为红黑树。 4. 维护结构修改计数和大小 modCount; if (size threshold)resize(); afterNodeInsertion(evict); return null;最后更新modCount表示HashMap的结构发生了变化。然后检查当前大小是否超过阈值如果超过则进行扩容。扩容通过resize方法完成。最后调用afterNodeInsertion方法执行插入后的操作返回null表示插入成功且没有旧值被覆盖。 三、关键细节与实现原理 1. 哈希函数 在HashMap中哈希函数的质量直接影响哈希表的性能。HashMap通过对键的哈希码进行二次扰动来减少哈希冲突提高哈希分布的均匀性。 2. 链表与红黑树 HashMap最初使用链表来处理哈希冲突但链表在极端情况下会退化为线性查找性能较差。为了解决这个问题Java 8引入了红黑树当链表长度超过阈值时默认是8会将链表转换为红黑树以提高查找效率。 3. 扩容机制 HashMap的扩容机制通过resize方法实现。每次扩容都会将容量扩大为原来的两倍并重新计算所有元素的索引位置。扩容是一个代价较高的操作因此HashMap会尽量延迟扩容直到元素数量超过阈值。 四、优化与最佳实践 1. 初始容量设置 为了减少扩容次数可以在创建HashMap时设置一个合理的初始容量。这样在插入大量元素时可以减少扩容操作提高性能。 2. 合理选择负载因子 HashMap的负载因子默认是0.75决定了扩容的阈值。负载因子越大空间利用率越高但哈希冲突的概率也越大。根据具体情况可以选择合适的负载因子以平衡空间利用率和性能。 3. 避免使用可变对象作为键 如果使用可变对象作为键在对象状态变化后哈希值可能会改变导致无法正确查找到对应的值。因此尽量使用不可变对象如String、Integer等作为键。 五、总结 通过对HashMap中putVal方法的深入分析我们了解了HashMap处理插入操作的详细过程包括初始化、哈希冲突处理、扩容机制等。理解这些内部细节不仅有助于我们更好地使用HashMap还能在需要时对其进行优化提升程序的性能。 在实际开发中选择合适的数据结构和算法是至关重要的。HashMap作为Java中常用的集合类其高效的实现和灵活的使用方式使得它在众多应用场景中得到了广泛的应用。希望通过本文的分析能够帮助读者更深入地理解HashMap的内部机制提高编程技巧和代码质量。
http://www.hkea.cn/news/14341035/

相关文章:

  • 中国建设银行什么是网站用户名江门东莞网络推广
  • 域名如何绑定网站专注网站建设
  • 中企动力做网站要全款易语言做网站简单教程
  • 商业网站有哪些怎么套用模板做网站
  • 商城系统网站模板简述网站的建设流程图
  • 公司行政负责做网站吗自适应网站举例
  • 网站页面设计策划书设计logo网站免费南蒲四特
  • 新昌县城乡建设局网站seo课程哪个好
  • 北京网站建设公司网络营销外包网络建站报价外链网站分类
  • 建设网站的一般步骤是郑州网站设计费用
  • 网站颜色搭配乔拓云智能建站官网登录入口
  • 园林景观设计案例网站商城网站开发企业
  • 网站优化建设深圳沧州网站建设网海申
  • 网站合同建设模板温州网站制作公司
  • 织里网站建设自己做网站 需要哪些
  • 淄博 网站运营php招聘网站建设
  • 郑州正规的网站设计国家级示范校建设网站
  • 局门户网站的建设一个公司网站备案吗
  • 学历网站怎么做一键生成app下载
  • 入群修改网站后台wordpress文件上传管理
  • wordpress菜单侧边栏福州seo管理
  • 网站建设全流程做内容的网站
  • 网站建设公司好wordpress 高亮插件
  • 菏泽网站建设公司官网logo是什么伊思logo
  • 商务网站开发考卷昆明做网站公司
  • 淘宝客优惠券网站怎么做的网店代运营犯法吗
  • 网站权重是什么意思php sqlite 做网站
  • 下沙做网站的公司计算机网络中小型企业网络设计方案
  • 网站不备案 能打开吗阿里云搜索引擎
  • 四川住房建设和城乡建设厅网站nginx wordpress