1.HashMap:根据键值hashCode值存储数据,大多数情况下可以直接定位到它的值,但是遍历顺序不确定。所有哈希值相同的值存储到同一个链表中
                        HashMap只允许一条记录的值为null,允许多条记录的值为null。
                        HashMap非线程安全,任意时刻可以有多个线程同时写HashMap
 
                为什么HashMap不是线程安全的?
                    1.比如两个线程同时使用put方法,刚好两个put方法的hashcode值一样,发生了碰撞,那么会发生值的覆盖。
                    2.当超过限定的threshold后,会进行rehash,所有的元素都要背重新计算一遍,这里会产生死循环,具体参考https://coolshell.cn/articles/9606.html
 
                 如何线程安全的使用HashMap?
                    1.Hashtable
                    2.ConcurrentHashMap
                    3.Synchronized Map
            
2.Hashtable:继承自Dictionary类,并且是线程安全的,任一时间只能有一个线程写HashTable,并发性不如ConcurrentHashMap,ConcurrentHashMap引入了分段锁
                            HashTable是线程安全的,但是效率低,HashTable使用synchronized,所以所有的线程竞争一把锁。
                            ConcurrentHashMap不仅线程安全而且效率高,因为它包含了一个Segment数组,将数据分段存储,给每一段数据配一把锁,也就是分段锁技术。
                      
3.LinkedHashMap:保存了记录的插入顺序
 
4.TreeMap:实现了SortedMap接口,能够把它保存的记录根据键排序,默认是按键值升序排序。      
 
 
HashMap的内部实现:
    1.存储结构:数组+链表+红黑树(JDK1.8之后引入的)
    2.HashMap使用哈希表存储,哈希表为了解决冲突,采用开放地址发和链地址法,Java中使用链地址法
    3.HashMap的默认构造字段
            threshold //所能容纳的key-value对极限  
            loadFactor //负载因子(默认值0.75)
            modCount //记录HashMap内部结构发生变化的次数
            size //实际存在的键值对数量
        threshold=length*loadFactor-----数组定义好长度后,负载因子越大,所能容纳的键值对个数越多
 
 
        是一种二叉查找树,每个节点增加一个存储为表示节点颜色(红色或黑色)
        对于二叉查找树,由n个节点随机构造的二叉查找树的高度为lgn,则二叉查找树的一般操作的执行时间为O(lgn)
            红黑树本质上是二叉查找树,又在二叉查找树的基础上增加了着色和相关的性质是的红黑树相对平衡,从而保证了红黑树查找、插入和删除的时间复杂度最坏为O(log n)
 
        红黑树的5个性质:
            1.每个节点或红或黑
            2.根节点是黑的
            3.每个叶节点是黑的
            4.如果一个节点是红的,那么它的两个子节点都是黑的
            5.对于任意结点,其到叶节点树微端NIL指针的每条路径都包含相同数目的黑节点
 
 
 
 
 
 
 
 
 
 
 

HashMap相关总结的更多相关文章

  1. 一张思维导图带你梳理HashMap相关知识

    HashMap可以说是java中最常见也是最重要的key-value存储结构类,很多程序员可能经常用,但是不一定清楚这个类背后的数据结构和相关操作原理,为了复习HashMap相关的知识,今天花了一天的 ...

  2. HashMap相关类:Hashtable、LinkHashMap、TreeMap

    前言 很高兴遇见你~ 在 深入剖析HashMap 文章中我从散列表的角度解析了HashMap,在 深入解析ConcurrentHashMap:感受并发编程智慧 解析了ConcurrentHashMap ...

  3. 问题(一)---线程池,锁、堆栈和Hashmap相关

    一.线程池: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中 ...

  4. JDK源码分析(5)之 HashMap 相关

    HashMap作为我们最常用的数据类型,当然有必要了解一下他内部是实现细节.相比于 JDK7 在JDK8 中引入了红黑树以及hash计算等方面的优化,使得 JDK8 中的HashMap效率要高于以往的 ...

  5. HashMap 相关面试题及其解答

    Q:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>[] ...

  6. HashMap相关(二)

    基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外, HashMap 类与 Hashtable 大致相同. ...

  7. LeetCode刷题笔记(2)HashMap相关应用

    1.问题描述 Example 1: Input: A = "this apple is sweet", B = "this apple is sour" Out ...

  8. JAVA中HashMap相关知识的总结(一)

    Java中HashMap在jdk1.7和jdk1.8中的区别点: 在jdk1.7中是用数组+链表形式存储,1.8采用数组+链表/红黑树形式 Jdk1.8中由链表转为红黑树是长度大于8,由红黑树转为链表 ...

  9. HashMap相关知识

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...

随机推荐

  1. 【Android自动化】unittest测试框架关于用例执行的几种方法

    # -*- coding:utf-8 -*- import unittest class test(unittest.TestCase): def setUp(self): print 'This i ...

  2. jQuery 1.11 / 2.1 beta 版发布

    jQuery开发团队近日发布了jQuery 1.11和2.1的beta版本. jQuery 1.x版本支持IE 6/7/8,jQuery 2.x 不支持,如果你已经抛弃了IE 6/7/8用户,可以升级 ...

  3. docker构建Java环境

    FROM java:7 COPY . /usr/src/javaapp WORKDIR /usr/src/javaapp RUN javac HelloWorld.java CMD ["ja ...

  4. -bash: fork: retry: Resource temporarily unavailable;centos6.5

    Last login: Wed Jun 18 14:04:11 2014 from 1.1.1.135 -bash: fork: retry: Resource temporarily unavail ...

  5. array_sum(),array_product()的使用

    这两个函数在你处理数据的时候,相信会很有用处. 一个是处理数组所有值的和,一个是所有值的乘积.写这个随笔就是强调下,有特殊的情况需要注意,以防以后的工作中,统计的时候出现错误. 举个例子: $a = ...

  6. Codeforces round 1100

    Div 2 532 我对交互一无所知 只能寄期望与NOI和省选不出交互吧... E 这个题,真的是耻辱... 其实非常简单,就是二分+判环... 那么就直接二分答案+拓扑排序即可... (我居然在考试 ...

  7. C# show FTP Download/Upload progress

    https://stackoverflow.com/questions/4591059/download-file-from-ftp-with-progress-totalbytestoreceive ...

  8. Linux中tty、pty、pts的概念区别 转载

    基本概念: > tty(终端设备的统称): tty一词源于Teletypes,或teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西 ...

  9. 【第十三课】监控Linux系统状态

    目录 1.查看系统负载命令:w.uptime 2.vmstat详解 3.top动态查看负载 4.sar命令(监控网卡流量) 5.nload命令(监控网卡流量) 6.iostat iotop(监控IO性 ...

  10. CS50.1

    1,GUI,graphical user interface,图形用户界面 2.VB,visual basic,微软开发的一种程序语言 3,BIT,binary digit 比特 4,byte 5,8 ...