2、哈希表

2.1、哈希冲突

冲突位置,把数据构建为链表结构。

装载因子=哈希表中的元素个数 / (散列表)哈希表的长度

装载因子越大,说明链表越长,性能就越低,那么哈希表就需要扩容,把数据迁移到新的哈希表中!

数据会经过两层比较:

一个是对哈希值的比较 使用hashcode()方法

另一个是对key值的比较,使用equals()方法

如果两个对象相同,hashcode一定相同。

但是hashcode相同,两个对象不一定相同。

哈希冲突是指,不同的key经由哈希函数,映射到了相同的位置上,造成的冲突。

  1. /**
  2. * @author Administrator
  3. * @date 2022-09-09 14:28
  4. */
  5. public class MyHashTable<K,V> {
  6. private Node<K, V>[] table; // 实例化一个Node数组 Node数组本身又是个链表
  7. private static class Node<K,V>{
  8. final int hash; //hash值
  9. final K key;
  10. V value;
  11. Node<K,V> next; //下一个节点 kv对
  12. public Node(int hash, K key, V value, Node<K, V> next) {
  13. this.hash = hash;
  14. this.key = key;
  15. this.value = value;
  16. this.next = next;
  17. }
  18. }
  19. public MyHashTable(int capacity) {
  20. table = (Node<K,V>[]) new Node[capacity];
  21. }
  22. public void put (K key,V value){
  23. // 1. 计算哈希值
  24. int hash = hash(key);
  25. // 2. 计算数组的索引值
  26. int i = (table.length-1) & hash;
  27. // 3. 把当前的kv对 存到Node里
  28. Node<K,V> node = new Node (hash,key,value,null);
  29. // 4. 根据索引下标 拿到目前table里的数据 然后进行对比
  30. Node<K,V> kvNode = table[i];
  31. if(kvNode == null ){
  32. // 如果为空 则说明当前位置没有数据 可以直接存
  33. table[i] = node;
  34. return;
  35. }
  36. // 如果有值 就去看 key是否一样
  37. if(kvNode.key.equals(key))
  38. {
  39. // 如果一样 就覆盖
  40. kvNode.value = value;
  41. }
  42. else{
  43. // 如果不一样就用链表存起来
  44. kvNode.next = node;
  45. }
  46. }
  47. public V get (K key){
  48. int hash = hash(key);
  49. int i = (table.length - 1 ) & hash;
  50. Node<K,V> node = table[i];
  51. if(node == null)
  52. {
  53. return null;
  54. }
  55. Node<K,V> newNode = node; // 做条件判断
  56. // 如果存在这个值 而且存在hash冲突 那就需要去循环这个链表 直到找到那个key
  57. while (node.next != null)
  58. {
  59. if (newNode.key.equals(key)){
  60. // 这就说明找到了 直接跳出循环
  61. break;
  62. }else{
  63. newNode=newNode.next; // 如果找不到key 就一直往链表的后面找
  64. }
  65. }
  66. return newNode.value; // 最后返回这个值
  67. }
  68. /**
  69. * 计算哈希值
  70. * @param key
  71. * @return
  72. */
  73. static final int hash(Object key){
  74. int h;
  75. return (key == null)? 0 : (h = key.hashCode()) ^ (h >>> 16);
  76. }
  77. public static void main(String[] args) {
  78. MyHashTable<String,String> hashTable = new MyHashTable<String, String>(5);
  79. hashTable.put("key1","ycw");
  80. hashTable.put("key2","ycw2");
  81. hashTable.put("key1","ycw3");
  82. System.out.println(hashTable.get("key1"));
  83. System.out.println(hashTable.get("key2"));
  84. }
  85. }

2.2、hashmap

扩容

​ 在填装因子(loaderFactor) > 0.75 时进行扩容

  1. 创建新的数组,长度newLength是原来的2倍(将哈希表的存储空间增加为原来的两倍)。
  2. 遍历旧列表中取出元素的key之后,重新进行hash计算 newndex = (newLength- 1) & hash。
  3. 重新插入元素。

Java实现哈希表的更多相关文章

  1. Java中哈希表(Hashtable)是如何实现的

    Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...

  2. JAVA数据结构--哈希表的实现(分离链接法)

    哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 ...

  3. java数据结构----哈希表

    1.哈希表:它是一种数据结构,可以提供快速的插入操作和查找操作.如果哈希表中有多少数据项,插入和删除操作只需要接近常量的时间.即O(1)的时间级.在计算机中如果需要一秒内查找上千条记录,通常使用哈希表 ...

  4. java数据结构——哈希表(HashTable)

    哈希表提供了快速的插入操作和查找操作,每一个元素是一个key-value对,其基于数组来实现. 一.Java中HashMap与Hashtable的区别: HashMap可以接受null键值和值,而Ha ...

  5. java资料——哈希表(散列表)(转)

    哈希表       散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...

  6. java集合-哈希表HashTable

    一.简介 HashTable也是一种key-value结构,key-value不允许null,并且这个类的几乎全部的方法都加上了synchronized锁,来保证并发安全,由于加了锁所以性能方面会比较 ...

  7. java集合-哈希表HashMap

    一.简介 HashMap是一个散列表,是一种用于存储key-value的数据结构. 二.类图 public class HashMap<K,V> extends AbstractMap&l ...

  8. Java数据结构——哈希表

  9. Java知多少(79)哈希表及其应用

    哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺 ...

  10. 哈希表类Hashtable

    哈希表是一种重要的存储方式,也是一种常见的检索方法.其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元 ...

随机推荐

  1. P1536 村村通(并查集)

    村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接 ...

  2. 【学习笔记】 - 基础数据结构 :Link-Cut Tree

    发现树剖代码太长了,给我恶心坏了 学个代码短点的能写树剖题的数据结构吧 前置知识 平衡树splay 树链剖分 简介以及优缺点介绍 Link-Cut Tree,也就是LCT,一般用于解决动态树问题 Li ...

  3. android:加载PDF几种方法汇总对比

    在安卓项目中,加载PDF文件,是一个比较常见的需求.又分为两大类, 1.加载网络PDF 2.加载一个本地静态PDF. 查阅资料,纵观网上在安卓中打开PDF的各种方式,大致可以分为以下几类, 1.直接使 ...

  4. 现代 CSS 解决方案:accent-color 强调色

    accent-color 是从 Chrome 93 开始被得到支持的一个不算太新属性.之前一直没有好好介绍一下这个属性.直到最近在给一些系统整体切换主题色的时候,更深入的了解了一下这个属性. 简单而言 ...

  5. 用Docker发布网站时,自动下载Directory.Build.props及其Import的文件

    为Blazor网站项目,"添加Docker支持" 这时,网站项目根目录下会新增Dockerfile. 里面文字内容如下 #See https://aka.ms/customizec ...

  6. 【Azure 环境】AAD 注册应用获取AAD Group权限接口遇 403 : Attempted to perform an unauthorized operation 错误

    问题描述 通过Azure AD的注册应用获取到Token后,访问AAD Group并查看日志信息时候,遇见了 {"error":{"code":"Un ...

  7. kotlin协程小记

    转载请标明出处:https://www.cnblogs.com/tangZH/p/16849169.html -[kotlin协程小记]-[协程的async使用]- [kotlin协程异常处理之-tr ...

  8. 8、zookeeper的集群搭建

    完全配置--https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html#sc_zkMulitServerSetup https://zoo ...

  9. 将本地文件上传到github仓库

    将本地文件上传到github空仓库 本地使用git上传文件: 第一步:在需要的文件夹(文件夹里已经放了需要提交的内容)右击git bash,输入git init 第二步:将本地文件上传到本地git仓库 ...

  10. JS-1基本语法

    初识JavaScript JavaScript是一种运行在客户端的脚本语言 脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行 现在也可以基于Node.js技术进行服务器编程 ...