hashmap

HashMap(1.8)底层原理之get(key)分析

可紊 提交于 2020-03-05 23:32:06
先上源码: public V get (Object key) { Node< K , V > e ; return (e = getNode( hash (key) , key)) == null ? null : e. value ; } 我们都知道hashMap底层数据结构为:数组+单项链表+红黑树; 获取一个value值首先要获取当前key值所在的节点,得到该节点 e. value 属性值即为目标值; 第一步:对key值进行hash运算,得到节点位置;(如何hash运算:获取key值得hashcode将其称为h值,然后对该h值>>>16无符号右移16将其称为h16,然后对这两个值进行异或运算 h^h16)。hash运算要经过三个步骤才能算出节点位置。 第二部:getNode(h,key); 有了结点位置,我们就可以进行下一步的运算;h即为数组的下标; final Node< K , V > getNode ( int hash , Object key) { Node< K , V >[] tab ; Node< K , V > first , e ; int n ; K k ; if ((tab = table ) != null && (n = tab. length ) > 0 && (first = tab[(n - 1 ) & hash]) != null ) {

java反序列化-ysoserial-调试分析总结篇(6)

谁说我不能喝 提交于 2020-03-05 22:57:36
前言: 这篇记录CommonsCollections6的调试,外层也是新的类,换成了hashset,即从hashset触发其readObject(),yso给的调用链如下图所示 利用链分析: 首先在hashset内部首先获取器容量与负载因子等操作,然后创建hashmap,将ObjectinputStream中的对象放到hashmap中,即调用hashmap.put函数,可以看到此时实际上放进去的是一个TiedMapEntry,TiedMapEntry是cc5加入进去的一个Map类,其getvalue函数能够获取指定map的key,所以跟进 hashMap在放入元素时将会对当前的key计算一个hash值,即这里调用hashCode()函数,所以即调用TiedMapEntry的hashCode()函数,在hashCode函数中将调用该类的getvalue函数, 所以从此刻开始就和CommonsCollections5的后续利用链相同了,因为CC5是在该类的toString中调用getvalue 接着就跳到this.map.get(this.key),此时this.map即为lazymap.get 在lazymap.get中将调用this.factory.transform,而我们知道this.factory是可控的,这里依然为chaindTransform

java基础进阶篇(六)_HashTable------【java源码栈】

被刻印的时光 ゝ 提交于 2020-03-05 18:30:25
一.概述   前面介绍了HashMap的结构和原理,这里介绍个类似HashMap的结构Hashtable。   HashTable 官方解释是HashMap的轻量级实现, 和 HashMap 一样,Hashtable 也是一个 散列表 ,它存储的内容是 键值对(key-value)映射 。   所以我们结合HashMap来介绍HashTable, 比较下两者的区别。   HashTable 使用的很少, 它支持线程安全, 通过内部方法加上 synchronized 实现, 因此同步锁的密度太大了, 在实际情况中笔者用的很少, 所以关于方法就不像HashMap 详细介绍了.后面会单独准备一章解决HashMap的线程同步问题. 二.和HashMap的比较 1.不同点 1).接口    Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。   HashMap继承AbstractMap,实现了Map, Cloneable, Serializable接口。 2).线程安全    Hashtable 线程安全,支持多线程并发, 内部方法使用synchronized 关键字约束同步代码块.   HashMap 线程不安全,需要开发人员额外解决. 后面章节会专门解释并发情况下数组和集合的处理. 3).初始容量和扩容   

JAVA学习要点总结

落花浮王杯 提交于 2020-03-05 09:38:26
文章目录 缓存 memcache的分布式原理 memcache的内存分配机制 如何存放数据到memcached缓存中?(memcache内存分配机制) memcache的惰性失效机制 memcache缓存的无底洞现象 一致性Hash算法的实现原理 Hash环 一致性Hash算法 Hash环的倾斜 虚拟节点解决Hash环倾斜 hash算法平衡性 memcached与redis的区别 Redis的主从复制 Redis的部分复制过程 Redis的主从复制阻塞模式 Redis的数据持久化方式 Redis的高可用部署方式 哨兵模式 Redis哨兵主要功能 Redis哨兵的高可用 哨兵如何判断redis主从节点是否正常? 集群模式 Redis可以在线扩容吗?zk呢 Redis高并发和快速的原因 浏览器本地缓存的了解和使用 缓存雪崩 缓存穿透 HashMap HashMap的Hash碰撞 HashMap的get和put原理 HashMap的rehash HashMap的线程不安全问题 HashMap和Hashtable的区别 为什么collection没有实现clonable接口 为什map没有实现collection接口 Map接口的实现有哪些,区别是什么 线程池 Executors框架的四种线程池及拒绝策略 四种线程池 JDK拒绝策略 Reactor模式 Reactor单线程模型

[源码分析]HashSet 和LinkedHashSet

本小妞迷上赌 提交于 2020-03-05 06:53:12
特性 HashSet 是一个可存储不重复元素的容器,底层实现依赖 HashMap ,所以在添加,删除,查找元素时的时间复杂度均为 O(1). 构造方法,初始化内部的 HashMap public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } 基础方法 add ,由于 HashSet只存储单个值,所以,内部以值为Key, private static final Object PRESENT = new Object(); 为 value存入HashMap中。当没有元素时候,返回true,已存在,返回false。 public boolean add(E e

【JDK】JDK源码分析-HashMap(1)

偶尔善良 提交于 2020-03-05 04:21:10
概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客。它其实就是前文「 数据结构与算法笔记(二) 」中「散列表」的实现,处理散列冲突用的是“链表法”,并且在 JDK 1.8 做了优化,当链表长度达到一定数量时会把链表转为红黑树。 因此,JDK 1.8 中的 HashMap 实现可以理解为「数组 + 链表 + 红黑树」。内部结构示意图: HashMap 的继承结构和类签名如下: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {} PS: 还记得以前初读 HashMap 源码时,用了周末两天的时间,而且读完脑子里还是一头雾水。当时也没做什么笔记,这次记录一下。 代码分析 一些成员变量 // 默认初始化容量(必须是 2 的次幂) static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // 最大容量(必须是 2 的次幂,且小于等于 2^30) static final int MAXIMUM_CAPACITY = 1 << 30; // 默认负载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; //

云时代架构阅读笔记四——深入的、详细的介绍Map以及HashMap

守給你的承諾、 提交于 2020-03-05 00:36:35
原文链接: https://mp.weixin.qq.com/s/GhZ-RfjscNsOraqD2z_eng 今天,笔者要介绍的是Java集合框架中的Map集合,在日常工作中Map的运用也十分广泛。 与List集合、Set集合隶属于Collection不同,Map是一个独立的接口,与Collection相同级别的接口。 重要的是,Map集合提供了一个不一样的元素存储方法,利用“key—value”的形式进行存储。其中,每个键映射一个值。而在Set集合中,元素的存储就是利用Map的这一特性来实现。 简单的介绍了下Map集合,接下来,就让笔者对其主要实现类HashMap、TreeMap、HashTable进行详细的说明 1 Map 常用方法 在具体介绍之前,我们先了解下Map接口本身,以便了解所有实现的共同点。 public interface Map<K,V> { //返回Map中的key--value的数目 int size(); //如果Map不包含任何key--value,则返回 true boolean isEmpty(); //如果Map中包含指定key的映射,则返回true boolean containsKey(Object key); //如果此Map将一个或多个键映射到指定值,则返回 true boolean containsValue(Object value)

HashMap源码深度解析

大城市里の小女人 提交于 2020-03-04 18:20:07
HashMap源码深度解析 一、重新认识HashMap 什么是HashMap? HashMap底层基于散列(Hash)算法,采用hash表实现键值对集合,继承了AbstractMap,实现了Map接口。最早出现在jdk1.2,允许null键和null值,null键的哈希值为0。需要注意的是HashMap不保证键值对顺序,同时非线程安全。 长啥样? 散列算法分为散列再探测和拉链式,HashMap采用的是拉链式,并在jdk1.8后使用红黑树优化长度大于等于8的链表。也就是说,目前HashMap底层数据结构为: 数组+链表+红黑树 。 数据结构如下图: 如上图所示,HashMap的数据结构采用数组和单链表(或者红黑树)组成,在进行增删改查时首先根据要查找元素的hash值定位到元素所在的数组下标(也称为桶),然后再根据这个桶所存储的元素的类型(单个node,单链表或红黑树)来找到该元素。 当单链表长度大于等于8时,转化为红黑树;当红黑树长度小于6时红黑树转化为链表。 HashMap特点 可以接受null键和null值,null键的hash值时0; 元素无序,可以序列化,线程不安全; 添加,查询的时间复杂度基本都是O(1); 存储元素时,根据键的hash值找到对应的桶。如果出现不同的对象计算出来的hash值相同,也就是hash冲突。为了解决这个问题

Java HashMap

巧了我就是萌 提交于 2020-03-04 16:10:24
import java.util.Map; /** * @author yuanxuan-chen * @date 2020-03-04 13:06 */ public class NP_HashMap { public static void main(String[] args) { /** * Map, 键值对,key-value, */ Map<Integer,Integer> map = new java.util.HashMap<Integer,Integer>(); /** * 添加,键是唯一的 */ map.put(1, 3); map.put(1, 7); map.put(2, 6); map.put(3, 9); /** * 将map2,加到map后面 */ Map<Integer, Integer> map2 = new java.util.HashMap<>(); map.put(4, 6); map.put(5, 6); map.put(6, 6); map.putAll(map2); /** * 输出键对应的值 */ int tmp = map.get(1); System.out.println(tmp); /** * map大小 */ int size = map.keySet().size(); System.out.println(size);

java集合

眉间皱痕 提交于 2020-03-04 15:40:53
java集合首先可以分为List、Set、Map这三种体系 Set:无序、不可重复的集合 List:有序、重复的集合 Map:代表具有映射关系的集合 注:java5以后又出现了queue体系集合,代表一种队列集合实现 **集合和数组的区别:**数组的元素可以是基本数据类型的值也可以是对象,而集合里只能保存对象 1.Iterator遍历元素: a)boolean hashNext():如果被迭代的集合元素还没有被遍历,则返回true b)Object next():返回集合里的下一个元素 c)void remove():删除集合里上一次next()方法返回的元素 一、HashSet 1.HashSet特点: a)不能保证元素的排列顺序 b)HashSet是不同步的,如果多个线程同时访问一个HashSet,必须要保证同步 c)集合元素值可以是null 2.HashSet用hashCode和equals方法来判断两个对象是不是同一个对象 hash算法是根据元素的值来计算出该元素的存储位置,而HashSet是通过每个元素的hashcode值来计算索引,从而可以自由增加HashSet的长度,并且可以根据元素的哈市Code值来访问元素,实际上HashSet是HashMap的一个实现类HashSet中的元素都存放在HashMap的key上面。 3.HashSet的底层实现