HashMap

实现了Map接口,线程不安全。

实现原理:

HashMap由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。

如果通过hash定位到数组位置没有链表,则查找、添加速度很快。否则,就要解决hash冲突,操作链表。遍历链表时,通过key对象的equals方法逐一比对。

构造hashmap的时候有两个参数,initialCapacity初始容量(默认16)、loadFactor装载因子(默认0.75)。

向容器中添加元素的时候,如果元素个数达到阈值(元素个数=数组长度*loadFactor),就要自动扩容。

使用一个新的数组代替已有的数组,每次扩容为先前的两倍。

经过 rehash 之后,元素的位置要么在原位置,要么在原位置再移动2次幂的位置。

hash函数

调用对象key自带的hashCode(),hashCode()返回intl类型值。

右位移16位,正好是32bit的一半,自己的高半区和低半区做异或,就是为了混合原始哈希码的高位和低位,以此来加大低位的随机性。而且混合后的低位掺杂了高位的部分特征,这样高位的信息也被变相保留下来。

散列值不能直接使用,还要对数组长度取模(异或实现散列值映射到数组,^代替%,效果一样),得到余数才能访问数组下标。如下:

https://www.hollischuang.com/archives/2091

Hashtable

Hashtable对外提供的public函数几乎都是同步的(synchronized关键字修饰),线程安全。

key和value都不能为null。

HashTable的数据结构和HashMap一样,采用Entry数组 + 链表的方法实现。

HashTabale初始的容量为11,负载因子为0.75,这点和HashMap不同,HashMap初始化时容量大小总是2的幂次方,即使给定一个不是2的幂次方容量的值,也会自动初始化为最接近其2的幂次方的容量。

哈希值计算方式是:int hash = key.hashCode()

数组索引计算方式是:int index = (hash & 0x7FFFFFFF) % tab.length; // 0x7FFFFFFF 即 Integer.MAX_VALUE(01111111 11111111 11111111 11111111)确保index为正数。

让HashMap同步:Map m =Collections.synchronizedMap(hashMao);

HashMap的迭代器(Iterator)是fail-fast迭代器,Hashtable的iterator遍历方式支持fast-fail,用Enumeration不支持fast-fail。

TreeMap

https://edu.csdn.net/course/play/5386/98487

TreeMap的数据结构是红黑树。

HashMap和Hashtable不保证数据有序,LinkedHashMap保证数据可以保持插入顺序,而TreeMap可以按key的大小顺序排序。

LinkedHashMap

LinkedHashMap保证数据可以保持插入顺序

LinkedHashMap在HashMap的基础上多了一个双向链表来维持顺序。

java 集合之HashMap、Hashtable、LinkedHashMap、TreeMap的更多相关文章

  1. 接口java.util.Map的四个实现类HashMap Hashtable LinkedHashMap TreeMap

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别 :java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMa ...

  2. HashMap,HashTable ,LinkedHashMap,TreeMap的区别

    Map:主要是存储键值对,不允许键重复,但可以值重复. HashMap:根据键的HashCode值来存储数据,根据键直接获取值.具有很快的访问速度,遍历时,取得的数据值的顺序都是随机的.hashMap ...

  3. HashMap Hashtable LinkedHashMap TreeMap

    // Map<String, String> map = new HashMap<String, String>(); // bb aa cc Map<String, S ...

  4. 杨晓峰-Java核心技术-9 HashMap Hashtable TreeMap MD

    目录 第9讲 | 对比Hashtable.HashMap.TreeMap有什么不同? 典型回答 考点分析 知识扩展 Map 整体结构 有序 Map HashMap 源码分析 容量.负载因子和树化 精选 ...

  5. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. Java集合详解6:TreeMap和红黑树

    Java集合详解6:TreeMap和红黑树 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储 ...

  7. 【转】Java集合:HashMap源码剖析

    Java集合:HashMap源码剖析   一.HashMap概述二.HashMap的数据结构三.HashMap源码分析     1.关键属性     2.构造方法     3.存储数据     4.调 ...

  8. java集合之HashMap源码解析

    Map是java中的一种数据结构,围绕着Map接口,有一系列的实现类如Hashtable.HashMap.LinkedHashMap和TreeMap.而其中HashMap和Hashtable我们平常使 ...

  9. 死磕 java集合之HashMap源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改 ...

  10. 基于散列的集合 HashSet\HashMap\HashTable

    HashSet\HashMap\HashTable 1 基于散列的集合 2 元素会根据hashcode散列,因此,集合中元素的顺序不一定与插入的顺序一致. 3 根据equals方法与hashCode方 ...

随机推荐

  1. SAE中Python无法创建多线程的解决方案

    最近在SAE上开发了一个给kindle退送书的小公众号(kindle免费书库),由于微信对http响应时间 有限制,而推送本身是发邮件,当附件一大就很容易超时而使得用户收不到应答.一开始我是想通过多线 ...

  2. 解决kubeadm部署kubernetes集群镜像问题

    kubeadm 是kubernetes 的集群安装工具,能够快速安装kubernetes 集群.kubeadm init 命令默认使用的docker镜像仓库为k8s.gcr.io,国内无法直接访问,需 ...

  3. centos7.5 安装python3.7

    一,官网下载最新版python安装包 二,解压并编译安装 ,解决依赖关系 yum -y install epel-release libffi-devel zlib* ,解压编译 .tgz cd Py ...

  4. python学习之面向对象(二)

    6.2 类的空间角度研究类 6.2.1 添加对象属性 [总结]对象的属性不仅可以在__init__里面添加,还可以在类的其他方法或者类的外面添加. class A: address = '召唤师峡谷' ...

  5. 三、Kubernetes_V1.10集群部署-master-部署flanne网络

    1. etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/server.pem --key-file=/etc/etcd/ ...

  6. [转帖]VPS、虚拟主机、云主机的区别

    引用知乎网友通俗的例子解释: https://www.cnblogs.com/fjping0606/p/9993849.html 其实 应该是 vps 只是 单台物理机上面的虚拟机 云主机 可能是资源 ...

  7. 一道最大公约数的题:easy number

    现有n个Zack,每个Zack有一个一个能力值,从这n个Zack中选出k个,使他们的最大公约数的值最大 [输入格式] 第一行有一个整数n,代表有n个Zack 第二行n个整数ai,代表每个Zack的能力 ...

  8. cannot convert from pointer to base class 'QObject' to pointer to derived class 'subClass' via virtual base 'baseClass'

    QT 编译不过的另一个问题: 1. 新建一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following ...

  9. liunx 环境下安装 Eclipse C++

    第一步:首先安装JDK 进入JDK官网:https://www.oracle.com/technetwork/java/javase/downloads/index.html  下载对应的jdk 注意 ...

  10. C#解决并发的设计思路

    解决并发的方案,应用场景,一个报名的方法,可是要限制报名的人数:一,如果是单机版,就是部署一个服务器站点的我们可以使用很经典的lock锁,或者queue队列,针对单机版二,如果是部署了集群的站点1&g ...