首页 > 编程语言 >java哈希存储--数据结构

java哈希存储--数据结构

时间:2024-12-25 19:02:32浏览次数:5  
标签:index 结点 java 哈希 -- buckets value key newNode


前言

前面学习过的数组存储和链式存储都有一定的缺点,哈希存储结合了二者的优点。

本文源代码网址:https://gitee.com/zfranklin/java/tree/master/dataStructure/src/com/njupt/hash

https://gitee.com/zfranklin/java/tree/master/dataStructure/src/com/njupt/hash


哈希表

哈希表本质上也是数组,但是每个数组元素是结点。我们可以通过索引key快速访问到某个数据。

哈希结点

相比链表结点,增加了key

class Node<T>
{
	int key;
	T value;
	Node<T> next;
	
	public Node(int key,T value)
	{
		this.key=key;
		this.value=value;
		this.next=null;
	}
}

成员变量

一个存储哈希结点的数组Node buckets[ ]。
buckets这个名字也是约定俗成。

方法

构造方法

和数组初始化一样

put存数据

我们分几种情况:

1.直接存在this.buckets[key%this.buckets.length]。
因为key可能会比buckets的长度大,所以取模操作,取模后的值为index。如果index的位置为空,直接将新结点存在该位置。

int index = key%this.buckets.length;
Node<T> newNode=new Node(key,num);
if(this.buckets[index]==null)
{
	this.buckets[index]=newNode;
	return true;
}

如果该位置原本有有效结点,又有两种情况:
2.已存在新结点key的结点,我们称为冲突,可以采用覆盖的方式,将就结点的value改为新结点的value进行覆盖。注意不可将整个结点进行覆盖。因为原结点的next指向了后面的结点,而新结点的next并没有指向下一个结点。

Node<T> p = this.buckets[index];
		while(p.next!=null && p.key!=newNode.key)
			p = p.next;
		if(p.key == newNode.key) p.value = newNode.value;

3.原本没有新结点的key,把数据加在现有数据的最后即可。

else p.next = newNode;

put方法全代码

public boolean put(int key,T num)
{
	int index = key%this.buckets.length;
	Node<T> newNode=new Node(key,num);
	if(this.buckets[index]==null)
	{
		this.buckets[index]=newNode;
		return true;
	}
	Node<T> p = this.buckets[index];
	while(p.next!=null && p.key!=newNode.key)
		p = p.next;
	if(p.key == newNode.key) p.value = newNode.value;
	else p.next = newNode;
	return true;
}

get取数据

通过索引key取数据,先找到对应的index结点,再一个结点一个结点往后查找,返回value。但是也可能找不到,返回null并提示。

总结

哈希存储key和value紧密相连,也叫KV存储。

标签:index,结点,java,哈希,--,buckets,value,key,newNode
From: https://blog.csdn.net/2303_81279773/article/details/144675435

相关文章

  • 安装Apache的常见报错并给出解决方案
    文章目录一、httpd-kinstall-nApache输入后,提示拒绝访问怎么办解决方案二、命令行输入:httpd-t报错解决方案三、httpd-kinstall-nApache输入后,另外一种报错解决方案测试是否成功四、路径问题引起报错解决方案一、httpd-kinstall-nApache输入后,提示......
  • PTA-统计字符出现次数
    本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。输入格式:输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。输出格式:在一行中输出给定字符在给定字符串中出现的次数。输入样例:programmingisMorefun!m输出样例:2代码如下......
  • node.js毕设 餐饮店外卖点餐系统 论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于餐饮店外卖点餐系统的研究,现有研究主要以传统餐饮点餐系统为主,专门针对餐饮店外卖点餐系统的研究较少。在国外,餐饮外卖行业发展较早且成熟,外卖点餐......
  • 毕业设计选题:信息安全专业最新选题推荐 开题建议
    目录前言毕设选题网络安全应用安全密码学 数据安全与隐私保护云安全选题迷茫选题的重要性更多选题指导最后 前言  ......
  • node.js毕设 承德学院校园招聘服务系统 论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于校园招聘服务系统的研究,现有研究多以综合性的招聘平台为主,专门针对承德学院这一特定院校的校园招聘服务系统的研究较少。在国内外的研究成果方面,国......
  • SAP生产订单常见状态释义&重读操作&状态后台表
    文章目录一、关于生产订单状态二、重读生产计划主数据的操作三、生产订单状态相关的后台表、BAPI【SAP系统PP模块研究】一、关于生产订单状态问:在SAP查询生产订单状态时,都是一连串的英文字母,都表示什么含义?答:(1)在CO03-生产订单抬头-“状态”栏,点击感叹号按钮,可以......
  • 数据结构之线性表之顺序表
    定义:由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表简单来说n个相同数据类型的数据组wsw合在一起的这么一个集合就是一个线性表线性表包括顺序表和链表1.顺序表(我们所有的代码实现都用函数来封装)(1)顺序表初始化代码实现:(2)顺序表在尾部增加元素:(3)遍历顺序表:(4)......
  • 玄机部分wp
    【玄机】日志分析-apache日志分析1、提交当天访问次数最多的IP,即黑客IP:/var/log/wtmp或/var/log/utmp—包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。这个命令能找到一个IP,也就是黑客IP但是这题的目的是找日志,我开始到/var/......
  • Python项目依赖管理
    做好Python环境的包版本管理对于确保项目的稳定性、可重复性和可维护性至关重要。以下是我平时采取的一些方法,期望对读者有所帮助:1.使用虚拟环境虚拟环境是实现包版本管理的重要基础,它可以隔离不同项目的运行环境,避免包版本冲突。我平时主要使用conda来管理虚拟环境。先在测试......
  • 三维动画的常用“视觉特效”有哪些?
    在当今的视觉盛宴中,三维动画技术宛如一位神奇的魔法师,为视觉特效(VFX)领域施下了变革的咒语。从大荧幕上的震撼电影,到让人沉浸其中的视频游戏,再到夺人眼球的广告以及精细的模拟场景,三维动画的视觉特效已然成为讲述精彩故事、牢牢吸引观众的核心法宝。今天,咱们就一同深入探究三维动画......