0. HashMap(TreeMAP)、HashSet、HashTable 的关系

  • HashMap 的底层则维护着 Node<K, V>[] table; 一个一维数组用于快速访问(只在初次使用时进行初始化,当需要扩容时,When allocated, length is always a power of two.)

    static class Node<K,V> implements Map.Entry<K,V> {
    final int hash; // 此处的 hash 相当于 bucket
    final K key;
    V value;
    Node<K,V> next; // 每个节点均链接着一个链表;

    在调用 get 方法返回该 key 对应的 value 时,先根据 key 对应的 hash 找到 bucket

    if ( (tab = table) != null &&
    (n = tab.length) > 0 &&
    (first = tab[(n - 1) & hash]) != null)
    {
    if (first.hash == hash && // always check first node
    ((k = first.key) == key || (key != null && key.equals(k)))) {
    return first; // 找到直接返回
    }
    // 否则遍历其链表
    if ( (e = first.next) != null) {
    do {
    ....
    } while ((e = e.next) != null);
    }
    }
  • HashMap 在解决冲突时,采用的是冲突链表(Separate chaining with linked lists)的方式;

  • HashSet 与 HashMap 有着相同的实现,HashSet 底层维护着一个 HashMap 对象,通过适配器模式是对 HashMap 的进一步封装(限制)
  • HashMap实现了Map接口,允许放入null元素,除该类未实现同步外,其余跟Hashtable大致相同
  • 与 TreeMap 相比,TreeMap 是有序的;

1. HashMap 的实现

  • 有两个参数可以影响HashMap的性能:初始容量(inital capacity)和负载系数(load factor,也叫装填因子)。初始容量指定了初始table的大小,负载系数用来指定自动扩容的临界值。

    • 当entry的数量(size)超过capacity*load_factor时,容器将自动扩容并重新哈希。
  • hashCode() 与 equals() 方法:
    • hashCode()方法决定了对象会被放到哪个bucket里,当多个对象的哈希值冲突时,equals()方法决定了这些对象是否是“同一个对象”

2. 散列(hash)的一些细节

如果 hashCode 是负数会怎样?负索引可不是你想要的。因此,一个改进的哈希公式会移出符号位(符号为同 0 相与),然后再用取模(即 %)运算符计算剩余部分。

(123  & 0x7FFFFFFF) % 20 = 3
(456 & 0x7FFFFFFF) % 20 = 16

references

HashMap(HashSet)的实现的更多相关文章

  1. Java 集合 HashMap & HashSet 拾遗

    Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果选择 ...

  2. HashTable HashMap HashSet区别(java)

    Hashtable: 1. key和value都不许有null值 2. 使用enumeration遍历 3. 同步的,每次只有一个线程能够访问 4. 在java中Hashtable是H大写,t小写,而 ...

  3. java HashMap HashSet的存储方式

    今天遇到一个bug,简单的说就是把自定义对象作为key 存到HashMap中之后,经过一系列操作(没有remove操作)之后 用该对象到map中取,返回null. 然后查看了HashMap的源代码,g ...

  4. HashMap,Hashset,ArrayList以及LinkedList集合的区别,以及各自的用法

    基础内容 容器就是一种装其他各种对象的器皿.java.util包 容器:Set, List, Map ,数组.只有这四种容器. Collection(集合) 一个一个往里装,Map 一对一对往里装. ...

  5. ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  6. 谈论HashMap,HashSet,HashTableeasy被我们忽视

    在正常发育,HashMap,HashTable,HashSet 他们批准了经常使用的按键值地图数据结构.在这里,我主要写一些平时我们使用的这些数据结构easy忽略. HashMap HashMap的结 ...

  7. HashMap/HashSet,hashCode,哈希表

    hash code.equals和“==”三者的关系 1) 对象相等则hashCode一定相等: 2) hashCode相等对象未必相等. == 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同 ...

  8. java 遍历方法 及 数组,ArrayList,HashMap,HashSet的遍历

    一,遍历方法的实现原理 1.传统的for循环遍历,基于计数器的: 遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止.主要就是需要按元素的位置来读取元素. ...

  9. java - day011 - 集合, ArrayList HashMap,HashSet, Iterator 接口, for-each 循环格式

    集合 ArrayList 丑数: 能被3,5,7整除多次, ArrayList     list 接口             | - ArrayList             | - Linked ...

  10. LinkedList,ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

随机推荐

  1. CodeForces - 786B Legacy (线段树+DIjkstra+思维)

    题意:给N个点和Q条选项,有三种类型的选项:1.从u到v花费w修建一条路:2.从u到下标区间为[L,R]的点花费w修建一条路; 3.从下标区间为[L,R]的点到u花费w修建一条路. 然后求起点s到其余 ...

  2. iOS 和服务端交互 数据加密策略

    总体逻辑: 客户端:对称加密数据,上传...回执对称解密 同理服务端:获取上传数据 对称解密 ...下发:对称加密 当且仅当登录接口和 拉新(更新nonce 和 key的接口)是对称加密上传 非对称解 ...

  3. 关于myeclipse+tomcat+struct2的热部署问题

    今天满心欢喜的打开电脑来写程序,却不曾想到它竟然给我搞事情,前几天刚学的struct2热部署竟然不好用了.每次改java文件都要重新部署好麻烦,最后花了了好长时间才解决,必须在这里总结一下: (1)s ...

  4. git-bash使用ctrl C无法终止nodemon的执行

    原因: git的bug 解决:git版本降级为2.10.0好了

  5. JavaWeb XML

    1. XML详解 1.1. XML介绍 1.1.1. 什么是XML XML的全称为eXtensible Markup Language,译为可扩展标记语言.XML语法上和HTML比较相似,但HTML中 ...

  6. 并发-ConcurrentHashMap源码分析

    ConcurrentHashMap 参考: http://www.cnblogs.com/chengxiao/p/6842045.html https://my.oschina.net/hosee/b ...

  7. JAVA实现计算三角形等平面图形的夹角问题

    问题重现 现在一平面上有三点,分别是x(x1,x2),y(y1,y2),z(z1,z2),图形大致如下 现要求用java代码求出∠YxZ的度数. 问题分析及数学模型 1.要求两直线的夹角,就想到数学中 ...

  8. NQueens, NQueens2 N皇后问题,递归回溯

    N皇后的规则:任意两个皇后不在同一行,不在同一列,不在同一斜线上. 算法分析:这种问题就用回溯法.深度搜索然后回溯.用一个数组记录每一行皇后的位置,下标代表行,值代表列.对行深度搜索. public ...

  9. js插件封装

    插件封装原则 1.暴露出来的实例必须只能是一个 2.IIFE包裹 !执行包裹 函数作用域保护 3.实例化方法不要写在函数内 throw这个方法是报错

  10. Centos6.5 安装gitlab 并使用自带的nginx

    Centos6.5 安装gitlab 并使用自带的nginx 1.安装依赖 yum -y install policycoreutils openssh-server openssh-clients ...