首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ConcurrentHashMap的put方法

计算key的哈希值for自旋保证put成功如果没有初始化就初始化table有可能多个线程去调用initTable()方法去初始化,用cas加锁就行了,成功一次就行了通过与哈希取模计算数组下标,如果下标节点为...null,就通过cas放进数组当前下标的位置如果当前下标有值,并且发现当前节点正在做扩容迁移操作,就去帮助扩容如果既有值,又没在扩容,就锁住这个数组下标节点,开始进行put操作第一种情况当前节点是一个链表遍历整个链表判断...hash不存在,此时已经遍历到了最后一个节点e,然后把当前的key/value添加到链表e节点的后i面,尾插法第二种情况当前节点是红黑树将节点放入红黑树,具体怎么放的参考我另一篇同系列下的文章之红黑树put...进去之后,会对链表长度进行判断,如果链表的长度大于等于8,进行扩容或者转化为红黑树链表的扩容如果tab的长度小于64,则调用tryPresize()方法进行扩容链表的扩容的本质是16->32,将数组扩容一倍...,然后将老数组的数据迁移到新的数组如果为空就初始化数组,跟之前的initTable()方法一样如果已经是最大容量了,直接返回判断sizeCtl是否小于0,因为只有在扩容中的时候sizeCtl才会小于0变成

78610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    解析HashMap中的put方法

    put方法的执行流程 我们直接通过一个程序来理解HashMap中put方法的执行流程,在put方法中,HashMap需要经历初始化、存值、扩容、解决冲突等等操作: public static void...接下来程序会执行put方法: public V put(K key, V value) { return putVal(hash(key), key, value, false, true);...} put方法又调用了putVal方法,并传入了key的hash,key,value等等参数,所以先来计算key的hash: static final int hash(Object key) {...所以,HashMap在第一次调用put方法时会创建一个总容量为16的Node类型数组(前提是调用无参构造方法),但实际上只有12的容量可以被使用,当第13个元素插入时,就需要考虑扩容。...,则将在第一次执行put方法时初始化一个总容量为16,实际可用容量为12的Node数组 当实际容量超过阈值时,HashMap会进行扩容,扩容至原容量的2倍 HashMap的put方法执行流程:首先判断当前

    70610

    HashMap中的添加数据put方法:深入解析HashMap中的put方法——逐步揭秘数据添加过程

    它的put方法是最常用的操作之一,本篇博客将深入探讨HashMap的put方法,逐步分解每个步骤,以便更好地理解数据的添加过程。 1....put方法首先会根据键的哈希码计算出存储桶(bucket)的位置。 2. 判断桶是否为空 一旦确定了存储位置,HashMap会检查该位置是否已经存在元素。...(1,1); //添加数据--->进入此方法 } } public V put(K key, V value...) { return putVal(hash(key), key, value, false, true); //继续进入方法 }...方法是一个复杂的过程,它涉及到了哈希桶的位置计算、冲突处理、链表转红黑树、键值对的替换与新增,以及在需要的情况下进行扩容等。

    67510

    8.并发容器ConcurrentHashMap#put方法解析

    定位Segment的方法就是通过散列函数来定位,先通过hash方法对元素进行二次散列,这个算法较为复杂,其目的只有一个——减少散列冲突,使元素能均匀分布在不同的Segment上,提高容器的存取效率。...我们通过最直观最常用的put方法来观察ConcurrentHashMap是如何通过key值计算hash值在定位到Segment的: 1 //ConcurrentHashMap#put 2 public...Segment 11   return s.put(key, hash, value, false); 12 }   Segment.put方法就是将键、值构造为Entry节点加入到对应的Segment...不妨继续深入Segment.put方法 : 1 //Segment#put 2 final V put(K key, int hash, V value, boolean onlyIfAbsent...有关ConcurrentHashMap的get方法不再分析,过程总结为一句话:根据key值计算出hash值,根据hash值计算出对应的Segment,再在Segment下的HashEntry链表遍历查找

    1.3K60

    安全研究 | 多种方式利用HTTP PUT方法漏洞

    今天分享的文章是对HTTP PUT方法开启漏洞的多种应用讲析,在实战场景中,首先我们要确定目标网站是否启用了HTTP PUT方法,如果启用的话,我们就可以结合多种利用工具和相关方法,向目标网站上传Meterpreter...HTTP PUT方法介绍 HTTP PUT方法最早目的用于文件管理操作,可以对网站服务器中的文件实现更改删除的更新操作,该方法往往可以导致各种文件上传漏洞,造成严重的网站攻击事件。...GET\PUT\POST\GET等多种方法。...如下: 首先,我们需要确定目标机器是否开启HTTP PUT方法。...方法的漏洞利用 这里,我们还要说说用Metasploit本身来对PUT方法的漏洞利用,用其内置的auxiliary/scanner/http/http_put模块就能完成相关shell文件meter.php

    6.4K30

    Map 只会 put、get?快来学这几个“新”方法

    引子Map的数据操作,你是不是还只会put、get?Map是我们日常编程中十分常用的数据接口,的在JDK8中,Map引入了几个新方法,可以简化我们对Map中数据的操作。...putIfAbsent也是一个见名知意的方法:不存在key或者值为null时,才将键值对放入Map。跟put方法相比,这个方法不会直接覆盖已有的值,在不允许覆盖旧值的场景使用起来会比较简洁。...("Jim", 88); scoreMap.put("Lily", 90); // 老写法 if (!...> fabMap = new ConcurrentHashMap(16); fabMap.put(0, 1); fabMap.put(1, 1); System.out.println...replace这个方法的效果是:如果key存在,则更新值如果key不存在,什么也不做总结可以看到,这些JDK8引入的Map的方法,都可以在某些特定场景下简化我们的代码,虽然不嫌麻烦的话,put、get等方法都可以搞定

    6310

    审计Tomcat PUT方法任意文件写入(CVE-2017-12615)

    欢迎关注我的微信公众号《壳中之魂》,查看更多网安文章 漏洞复现 产生原因 漏洞产生原因为web.xml里将readonly设置为了false(默认为true),导致了可以通过PUT写入任意文件 利用条件...>*.jspx 从中可以看出,除了.jsp和.jspx文件由JSPServlet处理,其他都由DefaultServelet处理(包括PUT...是由JSPServlet处理,所以无法触发漏洞 可以发现,即使即使readonly设置为false,tomcat也是不允许直接通过PUT方法上传jsp和jspx文件的,这是由于jsp和jspx文件是由org.apache.jasper.servlet.JspServlet...来处理,但是org.apache.jasper.servlet.JspServlet并不能处理PUT方法,所以要通过绕过来达到上传的目的 下面只对/绕过方法进行审计,针对%20、::$DATA绕过涉及到了...windows的特性过于复杂,可以查看参考文章 每一个Servlet的实现都要继承一个HttpServlet,在HttpServlet中有一个doPut方法来处理PUT方法,DefaulatServlet

    1.1K40
    领券