java·数据结构·hashMap

特点

  • 线程不安全
  • HashMap、和Hashtable、SynchronizedMap区别:
    • HashMap 线程不安全,可以有null的key值或value值。
    • hashtable 线程安全,不能有null的key值或value值。
    • ConcurrentHashMap 线程安全,不能有null的key值或value值。删除操作比较费时。
    • SynchronizedMap 线程安全,可以有null的key值或value值。
      • 可以通过Collections.synchronizedMap(new HashMap<String, Object>())方式创建
    • 性能:HashMap>ConcurrentHashMap>SynchronizedMap>Hashtable

构造方法

相关参数

  • initialCapacity:初始最大容量,默认1<<4(2^4),内部实际使用的变量是threshold(默认容量) ,实际最大容量并没有存放。
  • loadFactor:加载因子(默认容量=初始最大容量*加载因子),默认0.75
  • threshold:默认容量,内部变量,根据initialCapacity生成。执行构造方法时,将输入的initialCapacity转为不小于当前数的最小的2^k的值,作为threshold。在第一次构建table时(第一次put,执行resize()方法),table的大小设置为threshold,然后让threshold = thresholdloadFactor;后续每一次resize,都是table的大小 = table的大小 2;threshold = threshold * 2;
  • 默认关系:threshold = initialCapacity * loadFactor(达到最大容量时不满足该等式)

平衡与折衷

  • 加载因子:hash表中元素的填满程度,加载因子越大,空间利用率越高,冲突机会越高(查询成本越高)

代码解析

  • public HashMap(int initialCapacity, float loadFactor)
public HashMap(int initialCapacity, float loadFactor) {
        /**初始最大容量为非负整数*/
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        /**
        * static final int MAXIMUM_CAPACITY = 1 << 30;
        * 当 initialCapacity 大于最大容量(2^30,约10.74亿)时,强制设置为容量为最大容量。
        */
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        /**
        * 加载因子为大于0的浮点数
        * public static boolean isNaN(float v) {
        *   return (v != v);
        * }
        * Float.isNaN(loadFactor):NaN(not-a-number),例如. float v = 0.0f/0.0f;
        */
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        /**赋值容量因子*/
        this.loadFactor = loadFactor;
        /**
        * 转换输入的初始最大容量为2^k,赋值给threshold作为实际最大容量
        * 这样做的意义待分析
        */
        this.threshold = tableSizeFor(initialCapacity);
    }

/**
* 获取不小于当前数的最小的2^k的值.
* 例如:31->32,65->128
*/
static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
  • public HashMap(int initialCapacity)
public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
  • public HashMap()
/**
* 在resize()方法中设置threshold的值
* newCap = DEFAULT_INITIAL_CAPACITY;
* newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
*/
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
  • public HashMap(Map<? extends K, ? extends V> m)

    • 待梳理
    public HashMap(Map<? extends K, ? extends V> m) {
      this.loadFactor = DEFAULT_LOAD_FACTOR;
      putMapEntries(m, false);
    }

小结:

  • java位运算相关知识待归纳。 (位运算的目的是提高效率)

    • 1 << k(2^k)
  • double和float区别待归纳。
  • HashMap、treemap、treenodes关系
  • 为什么n初始化构造map时,转换输入的初始最大容量为2^k,赋值给threshold作为实际最大容量。

原文地址:https://www.cnblogs.com/kunlingou/p/11067857.html

时间: 2024-10-13 05:45:15

java·数据结构·hashMap的相关文章

Java数据结构-HashMap

Java数据结构-HashMap 1. HashMap数据结构 没有哈希冲突时,为数组,支持动态扩容 哈希冲突时,分为两种情况: 1. 当冲突长度小于8或数组长度小于64(MIN_TREEIFY_CAPACITY默认值为64)时,为数组+链表(Node) 2. 当冲突长度大于8时,为数组+红黑树/链表(TreeNode). 红黑树用于快速查找,链表用于遍历. 2. 红黑树 HashMap中的TreeNode是红黑树的实现. TreeNode几个方法 1. 左旋转 static <K,V> Tr

Java中的数据结构-HashMap

Java数据结构-HashMap 目录 Java数据结构-HashMap 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 1.1.2 HashMap继承图 1.2 HashMap 组成结构 1.2.1 Hashmap底层数据结构 2.HashMap源码解析 2.1 HashMap属性源码解析 2.1.1 HashMap中的静态常量 2.1.2 HashMap中的属性 2.1.3 HashMap中的存储结点 2.1.4 Hash表 2.2 HashMap数据的改变

[转]java 的HashMap底层数据结构

java 的HashMap底层数据结构 HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存.取value.下面就来分析HashMap的存取. 一.定义 HashMap实现了Map接口,继承AbstractMap.其中Map接口定义了键映射到值的规则,而AbstractM

Java中HashMap和SparseArray的数据结构

最近听同事说使用SparseArray代替HashMap可以提高性能,于是边对这两个类的数据结构进行简单的分析. Hashmap的数据结构  Hashmap是一个数组和链表的结合体(在数据结构称"链表散列"),如下图示: 图片来源:Java的HashMap和HashTable SparseArray的数据结构 SparseArray指的是稀疏数组(Sparse array),为了节省内存空间,并且不影响数组中原有的内容值.其内部有两个关键成员,分别是mKeys和mValues, 都是数

转发 java数据结构之hashMap详解

概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMap数据结构第3部分 HashMap源码解析(基于JDK1.6.0_45)第3.1部分 HashMap的“拉链法”相关内容第3.2部分 HashMap的构造函数第3.3部分 HashMap的主要对外接口第3.4部分 HashMap实现的Cloneable接口第3.5部分 HashMap实现的Seria

JAVA数据结构——Map之HashMap

JAVA数据结构--Map之HashMap 一.原型及简介 原型:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 简介:HashMap基于散列表实现的一个key-value数据结构,能够实现通过key值快速查找.HashMap继承自AbstractMap抽闲类,实现了Map接口. 二.数据结构原理介绍 如下图所示,HashMap

java数据结构之HashSet和HashMap(java核心卷Ⅰ读书笔记)

增加 删除 remove方法,可以删除指定的一个元素. 查找 ********************* **************************** HashSet既不可以用 0 1 2 3这种索引来确定元素的值,也不能用key来确定元素的值 ********************* HashSet就长这样的  ["aa" , "bb"] 长成这样的数据结构 ****************** HashMap长成这样的    {a=123  ,  

Java的HashMap和HashTable

Java的HashMap和HashTable 1. HashMap 1)  hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了.如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾. 2)使用 Map map = new Has

Java中HashMap和TreeMap的区别深入理解

首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体