2、哈希表

2.1、哈希冲突

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

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

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

数据会经过两层比较:

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

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

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

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

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

/**
* @author Administrator
* @date 2022-09-09 14:28
*/
public class MyHashTable<K,V> {
private Node<K, V>[] table; // 实例化一个Node数组 Node数组本身又是个链表 private static class Node<K,V>{
final int hash; //hash值
final K key;
V value;
Node<K,V> next; //下一个节点 kv对 public Node(int hash, K key, V value, Node<K, V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
} public MyHashTable(int capacity) {
table = (Node<K,V>[]) new Node[capacity];
}
public void put (K key,V value){
// 1. 计算哈希值
int hash = hash(key);
// 2. 计算数组的索引值
int i = (table.length-1) & hash;
// 3. 把当前的kv对 存到Node里
Node<K,V> node = new Node (hash,key,value,null);
// 4. 根据索引下标 拿到目前table里的数据 然后进行对比
Node<K,V> kvNode = table[i]; if(kvNode == null ){
// 如果为空 则说明当前位置没有数据 可以直接存
table[i] = node;
return;
}
// 如果有值 就去看 key是否一样
if(kvNode.key.equals(key))
{
// 如果一样 就覆盖
kvNode.value = value;
}
else{
// 如果不一样就用链表存起来
kvNode.next = node;
}
}
public V get (K key){
int hash = hash(key);
int i = (table.length - 1 ) & hash;
Node<K,V> node = table[i];
if(node == null)
{
return null;
}
Node<K,V> newNode = node; // 做条件判断
// 如果存在这个值 而且存在hash冲突 那就需要去循环这个链表 直到找到那个key
while (node.next != null)
{
if (newNode.key.equals(key)){
// 这就说明找到了 直接跳出循环
break;
}else{
newNode=newNode.next; // 如果找不到key 就一直往链表的后面找
}
}
return newNode.value; // 最后返回这个值
} /**
* 计算哈希值
* @param key
* @return
*/
static final int hash(Object key){
int h;
return (key == null)? 0 : (h = key.hashCode()) ^ (h >>> 16);
} public static void main(String[] args) {
MyHashTable<String,String> hashTable = new MyHashTable<String, String>(5);
hashTable.put("key1","ycw");
hashTable.put("key2","ycw2");
hashTable.put("key1","ycw3");
System.out.println(hashTable.get("key1"));
System.out.println(hashTable.get("key2"));
}
}

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. Spring Boot图书管理系统项目实战-11.检索图书

    导航: pre:10.借还统计 next: 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 index.html <!D ...

  2. spring boot使用拦截器修改请求URL

    假如我要将请求路径中/foobar都去掉? 1.定义拦截器 package com.laoxu.test.helloweb; import org.springframework.stereotype ...

  3. win10下开启IIS部署网站

    今天测试一个有关IIS的安全漏洞用了下win10下的IIS,记录一下,供网友参考. 1.启用IIS 依次点开: 控制面板-----程序----启用或关闭Windows功能 以下图片中打钩的地方全勾上. ...

  4. leetcode - 中序遍历

    给定一个二叉树的根节点 root ,返回 它的 中序 遍历 . 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 ...

  5. 2021-07-20 value!==value,JavaScript中NaN

    关于NaN NaN 属性代表一个"不是数字"的number类型的字面量值.这个特殊的值是因为运算不能执行而导致的,不能执行的原因要么是因为其中的运算对象之一非数字. NaN的出现场 ...

  6. Golang标准库——io

    原文:Golang标准库--io 1.io io包提供了对I/O原语的基本接口.本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加 ...

  7. mysql找出不包含某些关键字的结果

    比如公司业务是和房产相关的,但是库里存在和房产不相关的内容时就需要筛选并删除. 如何筛选才能不误伤呢? 这是我的一个初步的SQL: 意思是如果name.desc字段都不包含房.盘.楼.地产关键字才找出 ...

  8. Java 手动抛异常

    1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...

  9. idea导入spring源码运行缺失cglib和objenesis的jar包的办法【亲测有效】

    idea导入spring源码运行缺失cglib和objenesis的jar包的办法[亲测有效] 亲测有效,网上说的大多废话 上图,操作如下,运行gradle

  10. 19 SWERC 2022-2023 - Online Mirror (Unrated, ICPC Rules, Teams Preferred)L. Controllers(数学公式+瞎搞)

    L. Controllers 思路: #include <bits/stdc++.h> #define int long long #define rep(i, a, b) for(int ...