HashMap面试
HashMap面试点和逻辑详细分析
绅士jiejie
理想的生活,就是生活的理想!
展开
-
模仿HashMap-split()方法中的for循环,方便理解
HashMap-split()方法中的for循环源码TreeNode<K,V> b = this;for (TreeNode<K,V> e = b, next; e != null; e = next) { next = (TreeNode<K,V>)e.next; ...... ...原创 2020-02-21 17:59:29 · 657 阅读 · 0 评论 -
HashMap-split()方法源码简读(JDK1.8)
//红黑树转回链表的阈值static final int UNTREEIFY_THRESHOLD = 6; /** 这个方法在HashMap进行扩容时会调用到: ((TreeNode<K,V>)e).split(this, newTab, j, oldCap); * @param map 代表要扩容的HashMap * @param tab 代表新创建的数组,用来存放旧...原创 2020-02-21 17:57:58 · 2373 阅读 · 1 评论 -
HashMap-treeifyBin()源码简读(JDK1.8)
HashMap的treeifyBin()方法源码 final void treeifyBin(Node<K,V>[] tab, int hash) { //定义几个变量,n是数组长度,index是索引 int n, index; Node<K,V> e; //这里的tab指的是本HashMap中的数组,n为数字长度,如果...原创 2020-02-19 20:49:31 · 1026 阅读 · 0 评论 -
HashMap的扩容机制(JDK1.8)
HashMap扩容方法resize()源码://HashMap允许的最大容量,我理解就是数组的最大长度,而不是键值对总数static final int MAXIMUM_CAPACITY = 1 << 30;//数组默认初始长度static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//默认的加载因子 stati...原创 2020-02-19 20:46:38 · 2746 阅读 · 0 评论 -
HashMap何时会链表转红黑树(JDK1.8)?
链表转红黑树部分源码: //用来衡量是否要转红黑树的重要参数 static final int TREEIFY_THRESHOLD = 8; //转红黑树需要的最小数组长度static final int MIN_TREEIFY_CAPACITY = 64; for (int binCount = 0; ; ++binCount) { if ...原创 2020-02-19 20:44:54 · 5236 阅读 · 7 评论 -
HashMap-remove()源码简读(JDK1.8)
HashMap的remove()源码 public V remove(Object key) { //定义一个Node类型的变量e Node<K,V> e; //调用removeNode()删除key对应的节点,返回值就是被删除的节点,如果为null,就说明没有对应的节点,返回null,否则返回删除节点的value值 ...原创 2020-02-18 21:20:56 · 688 阅读 · 2 评论 -
HashMap-get()源码简读(JDK1.8)
HashMap的get()源码 public V get(Object key) { //定义一个Node对象来接收 Node<K,V> e; //调用getNode()方法,返回值赋值给e,如果取得的值为null,就返回null,否则就返回Node对象e的value值 return (e = getNode(has...原创 2020-02-18 19:01:46 · 380 阅读 · 0 评论 -
HashMap如何获取key值对应的索引的(JDK1.8)?
HashMap中的put方法获取key值对应索引的大致相关源码://put方法public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }//hash方法 static final int hash(Object key) { int h...原创 2020-02-18 17:54:27 · 6638 阅读 · 0 评论 -
EnumMap的实现原理
先看看EnumMap的构造方法之一://类型private final Class<K> keyType; //所有key值的数组private transient K[] keyUniverse;//key对应的value值,长度固定为枚举个数private transient Object[] vals;public EnumMap(Class<K>...原创 2020-02-13 11:43:01 · 526 阅读 · 0 评论 -
HashMap-put()方法源码简读(JDK1.8)
put方法源码//重点在putVal()方法public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } final V putVal(int hash, K key, V value, boolean onlyIfAbsent, ...原创 2020-02-17 19:20:27 · 357 阅读 · 0 评论 -
HashMap里的size属性到底指的是数组实际长度还是键值总数(JDK1.8)
在看这篇前需要了解以下几点HashMap里的键值数一旦大于阈值,就会进行扩容HashMap的底层数据结构是数组+链表+红黑树(JDK1.8)HashMap相同hash值,但是equals结果不相等的键值对会在同一条单向链表或红黑树中所以问题来了,这里所说的键值数大于阈值,这个键值数只是单纯的指在数组中(链表头的键值对)的键值数,还是指包含所有链表下键值对的所有键值数。以下跟进源码...原创 2020-02-17 19:19:38 · 7685 阅读 · 18 评论 -
HashMap构造方法源码简读(JDK1.8)
HashMap的构造方法//默认负载因子值static final float DEFAULT_LOAD_FACTOR = 0.75f;//HashMap最大容量:2的30次方static final int MAXIMUM_CAPACITY = 1 << 30;//当前HashMap所能容纳的键值对的最大值,超过就会进行扩容int threshold;//负载因子...原创 2020-02-16 21:51:23 · 554 阅读 · 0 评论