HashMap
文章平均质量分 62
HashMap相关
zhangjin1120
这个作者很懒,什么都没留下…
展开
-
HashMap系列:HashMap的遍历
后端给了一个完整的List,List中有不同类型的元素,需要用HashMap统计不同元素的数量。public class MapLoopTest { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("a", 3); map.put("b", 4); for (Ma.原创 2021-06-28 16:49:20 · 65 阅读 · 0 评论 -
HashMap系列:HashMap的key、value空值问题
HashMap的key值可以为null吗?HashMap的value值可以为null吗?HashMap的key和value可以同时为null吗?HashMap的key和value都可以为null。看下面demo: public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.put(null, null).原创 2021-03-17 10:16:25 · 2050 阅读 · 1 评论 -
HashMap系列:HashMap的key值为null时,hashCode是多少?
HashMap是根据hashCode来存储值的,在哪里计算hashCode了?hashCode是如何计算的?参考深入理解 hashcode() 和 HashMap 中的hash 算法原创 2021-03-18 09:41:32 · 562 阅读 · 0 评论 -
HashMap在Android开发中有哪些实际应用?
EventBus 中有多处用到HashMap,采用HashMap把event和订阅了这个event的对象集合存储起来,key是event对象的.class对象,value是CopyOnWriteArrayList。上面的参数总数不固定,比如:没有上架前channel参数可以不传,未登录的情况下userName也可以不传。一般缓存使用LinkedHashMap,LinkedHashMap继承自HashMap,所以也可以说缓存用的也是HashMap。这些条件,如果是可以增减的,条件总数量不确定。原创 2023-06-18 15:33:26 · 1298 阅读 · 0 评论 -
红黑树理解(一) 从2-3树到红黑树
二叉查找树也叫二叉排序树,二叉排序树可能会存在一侧过长,例如:五分钟搞懂什么是红黑树(全程图解)原创 2021-11-10 00:54:15 · 726 阅读 · 0 评论 -
红黑树理解(二) 插入过程图解
插入的节点是根节点直接插入,标记为黑色。插入的节点的父节点是黑色 例如:原红黑树中,只有根节点,根节点本来就是黑色,这是再次插入新节点,新节点的父节点就是黑色。 直接插入,标记为红色。插入的节点的父节点是红色,叔叔节点也是红色直接,将父亲节点和叔叔节点都改为黑色,新节点任然保持红色。插入的节点的父节点是红色,叔叔节点是黑色4.1 左左插入4.2 左右插入4.3 右右插入4.4 右左插入红黑树的原理 (插入+ 删除) 案例分析...原创 2021-11-10 09:33:09 · 796 阅读 · 0 评论 -
红黑树理解 (三)变色
红黑树的五个规则是什么?节点是红色或黑色的;根节点是黑色的;每个叶子节点都是黑色的空节点(NIL节点);每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不可能有两个连续的红色节点);从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点;什么情况下变色?插入新的节点后,红黑树的规则被打破,需要对原来的树进行调整。变色过程举例红黑树,超强动静图详解,简单易懂红黑树的原理 (插入+ 删除) 案例分析...原创 2021-11-09 23:45:00 · 257 阅读 · 0 评论 -
红黑树理解(四) 左旋
什么是黑高?红黑树中从任一节点到它的子树的每个叶子节点,黑色节点的数量都是相同的,这个数量被称为这个节点的黑高7张图带你了解红黑树变色、左旋和右旋算法导论习题练习——红黑树的插入和删除动画演示!红黑树解析【算法导论】红黑树详解之一(插入)红黑树的左旋,有没有统一的解释?以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。简单的讲:左旋就是旋转节点,向左偏移。30张图带你彻底理解红黑树...原创 2021-11-10 23:30:00 · 1012 阅读 · 0 评论 -
红黑树理解(五)右旋
右旋的目的是什么?将以旋转节点为根的红黑树的根节点左移,配合其他操作使红黑树恢复平衡。右旋的条件是什么?左子节点不为空。旋转节点的左路,存在两个相连的红色节点。右旋的具体步骤是什么?以某个结点作为旋转结点,其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。 出自:30张图带你彻底理解红黑树。也就是左子节点变为旋转节点的父节点。左子节点的右子节点变为旋转节点的右子节点。右旋举例(一)选转节点为插入节点的爷爷节点:再列举个稍原创 2021-11-10 23:45:00 · 741 阅读 · 2 评论 -
HashSet理解(一)java集合
为什么HashSet不常用?HashSet与ArrayList的区别是什么?原创 2021-10-31 11:41:47 · 194 阅读 · 0 评论 -
HashSet理解(二)怎么做到存储的值不重复
HashSet的实现,是一个value为PRESENT的HashMap。为什么value设置为PRESENT,是null不是更加节省空间吗?因为HashSet的add方法,要返回一个boolean值,为true,表示添加了新的元素,false表示添加了一个重复的值。add方法内部调用了HashMap的put方法: public boolean add(E e) { return map.put(e, PRESENT)==null; } //HashMap pu原创 2021-10-31 19:20:26 · 599 阅读 · 0 评论 -
HashSet理解(三)add方法(jdk1.7及以前)是如何插值的
& (按位与)运算的结果 &运算符,具体怎么算的,这篇:java运算符手把手教你计算。按位与有个特点,算式x&y中,当y=2^n-1时,例如3,7,15等,其作用类似于x%y。测试下: public static void main(String[] args) { System.out.println(15&15); System.out.println(16&15); System.out.println(原创 2021-10-31 21:40:51 · 233 阅读 · 0 评论 -
HashSet理解(四)为什么jdk1.7中的头插法会形成环和死循环?
jdk1.7中,多线程环境下,扩容时会产生环。扩容的过程:从addEntry()到transfer()之前的文章都分析的是jdk1.6,jdk1.6和jdk1.7的addEntry()方法有区别,但区别不大。看看1.7的扩容: void addEntry(int hash, K key, V value, int bucketIndex) { //当size大于等于某一个阈值thresholdde时候且该桶并不是一个空桶; if ((size >= threshol原创 2021-11-01 22:12:07 · 2991 阅读 · 0 评论 -
HashMap与HashSet的区别
区别HashMap是映射,存储的是多个键值对。HashSet是集合,存储的是不重复的对象。HashMap可以根据key值,取出某一组键值对。HashSet只能整个遍历。联系:java中HashSet的代码实现,就是HashMap。HashSet的本质,就是一个所有value都是PRESENT的HashMap,HashSet中存储的对象集合,就是HashMap的key集合。...原创 2021-11-02 07:13:24 · 726 阅读 · 0 评论 -
jdk1.8 HashMap链表转红黑树(一)从put到treeify
什么情况下转红黑树?下面两个条件必须同时满足,才会转红黑树当前插入链表的长度大于或等于8。HashMap中的数组,长度大于或等于64。如果只是链表长度大于等于8,数组长度没有达到64,只会扩容,不会转红黑树。从put方法到红黑树插入的具体过程 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }final V putVal(int hash, K原创 2021-11-13 23:07:14 · 1193 阅读 · 0 评论 -
简述:如何解决HashMap线程不安全的问题?
jdk1.8中HashMap为什么线程不安全?会出现数据覆盖。JDK1.7和JDK1.8中HashMap为什么是线程不安全的?怎么解决HashMap线程不安全的问题?1.使用HashTable替代HashMapHashTable的put操作,有synchronized关键字修饰。2.使用Map map = Collections.synchronizedMap(new HashMap());这个方法实际上返回了一个SynchronizedMap。SynchronizedMap 实原创 2021-11-14 10:01:56 · 6267 阅读 · 0 评论 -
LinkedHashMap是如何实现有序的?
LinkedHashMap是怎么实现有序的?LinkedHashMap内部持有两个成员变量,head和tail,是双链表结点。 在插入数据时,仍然调用HashMap的put方法,将数据保存在原先的数组+链表/红黑树的数据结构中,又重写了newNode()方法,在newNode方法中,把新的结点插入双向链表。采用尾插法,保证了后插入的数据,位于双向链表的尾部。遍历时,从head结点开始遍历输出,输出顺序自然就和插入顺序一样。LinkedHashMap迭代遍历的源码分析常见的两种用iterator遍原创 2021-11-20 18:51:33 · 2957 阅读 · 0 评论