小伙伴们,你们好呀!我是老寇!

不久前,技术总监问了一些数据结构的问题,我居然回答不出来啦,我赶紧掏出手机,迅速打开浏览器并呼叫度娘,很快啊,就在那几秒之间,我感觉数据结构的知识在我的脑海中重复了千万遍!

1.哈希表

哈希表又叫散列表,它是支持快速插入和搜索的一种数据结构,它通过将键(哈希码)映射到存储桶。以加快数据的查找速度,这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。

因此,我们可以得出这样的结论,哈希表用的是数组支持下标访问数据的特性,哈希表也是数组的一种拓展,由数组演变而来。

哈希函数

我们都知道哈希函数在整个过程中发挥着重要作用,通过一个小例子认识它

说明:哈希函数是将key通过一系列的操作,然后得到一个int类型的哈希值

    public int hashCode(String key) {return Integer.parseInt(String.valueOf(System.currentTimeMillis() + key.length()));}

注意:1.哈希值是一个非负整数

2.两个相同的键,通过哈希函数计算的哈希值也相同

3.两个不同的键,计算出的哈希值不同

注:因为数组的存储空间有限,导致很容易出现哈希冲突,即使现在非常著名的MD5、SHA、CRC哈希算法,也没有办法避免哈希冲突.。

哈希冲突

有两种解决方法,开放寻址法和链表法

哈希表分为哈希集哈希映射

哈希集:存储的数据是不重复的集合,比如HashSet

哈希映射:存储的数据是键值对的结构,比如HashTable、HashMap(红黑树)

2.实现过程

1.哈希映射

package org.laokou.hash;/*** @author Kou Shenhai*/
public interface Table<T> {/*** 插入* @param key* @param value*/void put(String key,T value);/*** 搜索* @param key* @return*/T get(String key);/*** 移除* @param key*/void remove(String key);}
package org.laokou.hash;import org.laokou.list.LinkedList;/*** 哈希表* @author Kou Shenhai 2413176044* @version 1.0* @date 2021/9/5 0005 上午 10:58*/
public class ConcurrentHashTable<T> implements Table<T> {private int size;private volatile LinkedList<T>[] linkedListArray;public ConcurrentHashTable() {this(10);}public ConcurrentHashTable(int initCapacity) {this.size = initCapacity;initHashTable();}private void initHashTable() {if (null == linkedListArray) {synchronized (this) {if (null == linkedListArray) {linkedListArray = new LinkedList[size];}}}}private int getIndex(String key) {return Math.abs(getHash(key) % size);}private int getHash(String key) {return key.hashCode();}public void put(String key, T value) {int index = getIndex(key);LinkedList<T> linkedList = linkedListArray[index];if (null == linkedList) {linkedListArray[index] = new LinkedList();}linkedListArray[index].add(key,value);}public T get(String key) {int index = getIndex(key);LinkedList<T> linkedList = linkedListArray[index];if (null == linkedList) {return null;}return linkedListArray[index].get(key);}public void remove(String key) {int index = getIndex(key);LinkedList<T> linkedList = linkedListArray[index];if (null != linkedList) {linkedListArray[index].remove(key);}}}

2.哈希集

package org.laokou.hash;import org.laokou.list.List;/*** @author Kou Shnehai*/
public interface Set<T> extends List<T> {/*** 移除* @param value*/void remove(T value);
}
package org.laokou.hash;import org.laokou.list.ArrayList;/*** TODO** @author Kou Shenhai 2413176044* @version 1.0* @date 2021/9/5 0005 下午 1:05*/
public class ConcurrentHashSet<T> implements Set<T> {private int size;private volatile ArrayList<T>[] arrayListArray;public ConcurrentHashSet() {this(10);}public ConcurrentHashSet(int initialCapacity) {this.size = initialCapacity;initHashSet();}private void initHashSet() {if(null == arrayListArray) {synchronized (this) {if(null == arrayListArray) {arrayListArray = new ArrayList[size];}}}}private int getHash(T value) {return value.hashCode();}private int getIndex(T value) {return Math.abs(getHash(value) % size);}public void add(T value) {int index = getIndex(value);ArrayList<T> arrayList = arrayListArray[index];int arrayIndex = get(value, index);if (null == arrayList) {arrayListArray[index] = new ArrayList();}if (arrayIndex < 0) {arrayListArray[index].add(value);}}public void remove(int index) {}public void remove(T value) {int index = getIndex(value);int arrayIndex = get(value, index);if (arrayIndex >= 0) {arrayListArray[index].remove(arrayIndex);}}public T get(int index) {return null;}public int get(T value,int index) {ArrayList<T> arrayList = arrayListArray[index];if (arrayList == null) {return -1;}for (int i = 0; i < arrayList.size(); i++) {if (arrayList.get(i) == value) {return i;}}return -1;}public int size() {int length = 0;for (int i = 0; i < size; i++) {ArrayList<T> arrayList = arrayListArray[i];if (arrayList != null) {length += arrayList.size();}}return length;}}

具体代码,已上传到码云

java基础-哈希映射和哈希集相关推荐

  1. Leetcode刷题100天—706. 设计哈希映射(哈希表)—day74

    前言: 作者:神的孩子在歌唱 一个算法小菜鸡 大家好,我叫智 706. 设计哈希映射 难度简单248 不使用任何内建的哈希表库设计一个哈希映射(HashMap). 实现 MyHashMap 类: My ...

  2. 【黑马】Java基础从入门到起飞目录合集

    视频链接: Java入门到起飞(上部):BV17F411T7Ao Java入门到起飞(下部):BV1yW4y1Y7Ms 学习时间: 2023/02/01 -- 2023/03/09 断断续续的学习,历 ...

  3. LeetCode哈希表(哈希集合,哈希映射)

    文章目录 哈希表 1.原理 2.复杂度分析 题目&推荐列表 哈希集合的应用 0.常用解题模板 1.lc217 存在重复元素 2.lc136 只出现一次的数字 3.快乐数 哈希映射的应用 0.常 ...

  4. 保研机试——1基础算法(排序、哈希、模拟(日期、图形、查找、进制、字符串)、递归与分治、贪心)

    写在前面的话:笔者在大三上学期(2022.9.20)对刷算法题基本为0基础,通过博客记录自己的学习过程,本人的学习计划为: 1.大三上学期:首先看<王道计算机机试考研指南>,着重看看保研机 ...

  5. 【重难点】【Java基础 01】一致性哈希算法、sleep() 和wait() 的区别、强软弱虚引用

    [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别.强软弱虚引用 文章目录 [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别. ...

  6. java取余数的函数_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  7. igs无法分配驱动器映射表_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  8. kotlin将对象转换为map_Kotlin程序将哈希映射(HashMap)转换为列表(List)

    Kotlin程序将哈希映射(HashMap)转换为列表(List) 在此程序中,您将学习在Kotlin中将map转换为列表的不同方法. 示例:将map转换为列表 示例import java.util. ...

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

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

最新文章

  1. mysql插入数据显示中文乱码
  2. 如何“正确”为SharePoint字段命名
  3. 一行代码快速搞定Flowable断点下载(下)
  4. 《深入理解计算机系统》读书笔记五:信息的表示和存储
  5. Hybrid框架UI重构之路:三、工欲善其事,必先利其器
  6. ImportError: cannot import name 'discovery'
  7. CentOS thrift python demo
  8. 机器人总动员拟人后_WALL·E 机器人总动员——又是一部让名字耽误的高分电影...
  9. 在Idea2017.1中编译时发生如下的错误
  10. 教你高效管理CrossOver容器
  11. AlgoSec破解license
  12. 渗透测试常用工具-端口扫描
  13. gyb优化事项(1)
  14. Tesseract中文语言包 chi_sim.traineddata,免费下载 而且还是最新的
  15. pentaho使用步骤简介
  16. 用于半导体的RCA清洁技术
  17. itextword加公章 java_使用itext和freemarker来根据Html模板生成PDF文件,加水印、印章...
  18. 【无标题】移动端App下载页面模版
  19. 2021年煤气考试题库及煤气考试内容
  20. 简单家乡风景静态HTML网页设计作品 DIV布局家乡介绍网页模板代码 DW个人网站制作成品 web网页制作与实现

热门文章

  1. 原 大数据入门学习,你要掌握这些技能
  2. Java 身份证排序
  3. 基于趋动云部署秋葉aaaki的Stable Diffusion整合包v4--linux版
  4. vue webpak版本 查看_vue 安装webpack
  5. java中URL地址中文乱码问题
  6. 劳拉快跑:假如你今天晚一秒钟出门的话……
  7. Numpy : 关于np.finfo函数
  8. 2023最新ChatGPT中文自适应网页版带后台会员中心PHP源码
  9. $(...).on is not a function 解决方案
  10. 详细讲解 —— 操作符(C语言初阶)(万字长文)