哈希表

解释

哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方

内存结构分析图

  • 1、定义一个类为结点,存储的信息
  • 2、定义链表的相关操作
  • 3、定义一个数组存储多条链表

各个部分的分析

1、结点:

//定义链表的节点

class Student {
public int id;
public String name;
public String sex;
public Student next;//指向下一个节点 public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
} }

2、定义链表
(这里和单链表不同的一点是头节点的初始化,在单链表中为了确定链表的开始位置,设置head结点不存储任何数据,只是用来确定链表开始的位置。在哈希表中,链表的头位置存储在数组中,为链表的开始,可以存储数据)


class linkList {
private Student head;//定义一个头节点,下一个指向为null //增加操作
public void add(Student student) {
//1、当前链表为空,则直接将节点加在后边
if (head == null) {
head = student;
return;
} Student temp = head;//定义辅助节点
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;//移动节点
}
temp.next = student;//将新的节点链接到链表尾
} //遍历节点
public void list() {
if (head == null) {
System.out.println("链表为空");
return;
} Student temp = head;
while (true) {
System.out.printf("==>id=%d name=%s sex=%s\t", temp.id, temp.name, temp.sex);
if (temp.next == null) {
break;
} temp = temp.next;
}
System.out.println(""); } //根据id查询某个学生的相关信息
public void getStudentById(int id){
if(head==null){
return;//当前链表没有
} Student temp=head;//辅助节点
while (true){ if(temp.id==id){
System.out.println("id为"+id+"学生的信息为:id:"+temp.id+" 姓名:"+temp.name+" 性别:"+temp.sex);
break;
}
if(temp.next==null){
return;//该链表不存在
}
temp=temp.next;//指向下一个节点
} } }

3、定义储存多条链表
(注意的点:需要初始化每一条存储在数组中的链表。使用for循环)

class ArrayHashTable {
public int sizeMax;
public linkList[] hashtabl; //初始化数组
public ArrayHashTable(int sizeMax) {
super();
this.sizeMax = sizeMax;
hashtabl = new linkList[this.sizeMax];
for (int i = 0; i < sizeMax; i++) {
hashtabl[i] = new linkList(); }
} //添加数据
public void addArray(Student student) {
int index = fun(student.id);
hashtabl[index].add(student);
} //定义一个散列函数
public int fun(int id) {
return id % 10;
} //遍历哈希表
public void list1() {
for (int i = 0; i < hashtabl.length; i++) {
System.out.printf("当前第%d链表信息:", i + 1);
hashtabl[i].list();
}
} //查询某个学生的id
public void getStudentById(int id){
for (int i = 0; i < sizeMax; i++) {
hashtabl[i].getStudentById(id); } } }

代码实现

举例:

package com.zheng.demo6;

public class MyHashTable {
public static void main(String[] args) {
//定义几个节点
Student student1 = new Student(1, "小明", "女");
Student student2 = new Student(2, "小红", "女");
Student student3 = new Student(3, "小青", "女");
Student student4 = new Student(4, "小黑", "男");
Student student5 = new Student(5, "小刚", "男");
Student student6 = new Student(11, "李白", "男");
Student student7 = new Student(13, "张三", "男");
Student student8 = new Student(23, "李四", "男");
Student student9 = new Student(10, "麻子", "男"); ArrayHashTable hashTable = new ArrayHashTable(8);
hashTable.addArray(student1);
hashTable.addArray(student2);
hashTable.addArray(student3);
hashTable.addArray(student4);
hashTable.addArray(student5);
hashTable.addArray(student6);
hashTable.addArray(student7);
hashTable.addArray(student8);
hashTable.addArray(student9); System.out.println("遍历哈希表");
hashTable.list1();
System.out.println("查询数据");
hashTable.getStudentById(23); } } class ArrayHashTable {
public int sizeMax;
public linkList[] hashtabl; //初始化数组
public ArrayHashTable(int sizeMax) {
super();
this.sizeMax = sizeMax;
hashtabl = new linkList[this.sizeMax];
for (int i = 0; i < sizeMax; i++) {
hashtabl[i] = new linkList(); }
} //添加数据
public void addArray(Student student) {
int index = fun(student.id);
hashtabl[index].add(student);
} //定义一个散列函数
public int fun(int id) {
return id % 10;
} //遍历哈希表
public void list1() {
for (int i = 0; i < hashtabl.length; i++) {
System.out.printf("当前第%d链表信息:", i + 1);
hashtabl[i].list();
}
} //查询某个学生的id
public void getStudentById(int id){
for (int i = 0; i < sizeMax; i++) {
hashtabl[i].getStudentById(id); } } } class linkList {
private Student head;//定义一个头节点,下一个指向为null //增加操作
public void add(Student student) {
//1、当前链表为空,则直接将节点加在后边
if (head == null) {
head = student;
return;
} Student temp = head;//定义辅助节点
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;//移动节点
}
temp.next = student;//将新的节点链接到链表尾
} //遍历节点
public void list() {
if (head == null) {
System.out.println("链表为空");
return;
} Student temp = head;
while (true) {
System.out.printf("==>id=%d name=%s sex=%s\t", temp.id, temp.name, temp.sex);
if (temp.next == null) {
break;
} temp = temp.next;
}
System.out.println(""); } //根据id查询某个学生的相关信息
public void getStudentById(int id){
if(head==null){
return;//当前链表没有
} Student temp=head;//辅助节点
while (true){ if(temp.id==id){
System.out.println("id为"+id+"学生的信息为:id:"+temp.id+" 姓名:"+temp.name+" 性别:"+temp.sex);
break;
}
if(temp.next==null){
return;//该链表不存在
}
temp=temp.next;//指向下一个节点
} } } //定义链表的节点 class Student {
public int id;
public String name;
public String sex;
public Student next;//指向下一个节点 public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
} } // public void add(Student student) {
// //1、当前链表为空,则直接将节点加在后边
// if (head == null) {
// head = student;
// }
// Student temp = head;//定义辅助节点
// while (true) {
// if (temp.next == null) {
// temp.next = student;
// break;//遍历到链表的尾部
// }
// temp = temp.next;//移动节点
// }
//
// }

数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储的更多相关文章

  1. 深入理解PHP内核(六)哈希表以及PHP的哈希表实现

    原文链接:http://www.orlion.ga/241/ 一.哈希表(HashTable) 大部分动态语言的实现中都使用了哈希表,哈希表是一种通过哈希函数,将特定的键映射到特定值得一种数据 结构, ...

  2. java哈希表(线性探测哈希表。链式哈希表)

    哈希表(散列表) 通过哈希函数使元素的存储位置与它 的关键码之间能够建立一一映射的关系,在查找时可以很快找到该元素. 哈希表hash table(key,value) 的做法其实很简单,就是把Key通 ...

  3. 数据结构 哈希表(Hash Table)_哈希概述

    哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...

  4. 【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串

    二分答案,然后搞出hash值扔到哈希表里.期望复杂度O(n*log(n)). <法一>next数组版哈希表 #include<cstdio> #include<cstri ...

  5. java操作数据库,以页面显示学生信息为例

    该部分内容实现的功能主要是:从数据库中查询数据并展示到页面,在页面中新增数据信息,在页面中修改数据信息,在页面中删除数据信息. =================stuList.jsp======== ...

  6. java web利用jsp完成简单的学生管理系统

    index.jsp <%@ page language="java" import="java.sql.*" pageEncoding="utf ...

  7. 彻底弄明白之数据结构中的排序七大算法-java实现

    package ds; /* * author : codinglion * contact: chenyakun@foxmail.com */ import java.util.Random; pu ...

  8. 哈希表-java

    import java.util.HashMap; import java.util.Iterator; public class JavaHashMap { public static void m ...

  9. Java学习:Set接口与HashSet集合存储数据的结构(哈希表)

    Set接口 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许存储重复的元素 没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.u ...

随机推荐

  1. Mysql8基础知识

    系统表都变为InnoDb表 从MySQL 8.0开始,系统表全部换成事务型的InnoDB表,默认的MySQL实例将不包含任何MyISAM表,除非手动创建MyISAM表 基本操作 创建数据表的语句为CR ...

  2. 【Java】学习路径48-线程锁ReentrantLock

    与上一章学习的线程锁synchronized类似,都是为了解决线程安全的问题. 使用方法: 新建一个ReentrantLock对象.(如果使用Thread多线程,则需要声明static静态) 然后在需 ...

  3. Java-随机数据生成器(造数据)

    概述 简单易用的随机数据生成器.一般用于开发和测试阶段的数据填充.模拟.仿真研究.演示等场景.可以集成到各种类型的java项目中使用. 优点 非常轻量级(不到1M),容易集成,无需过多第三方依赖 简单 ...

  4. SpringMVC 01: SpringMVC + 第一个SpringMVC项目

    SpringMVC SpringMVC概述: 是基于MVC开发模式的框架,用来优化控制器 是Spring家族的一员,也具备IOC和AOP 什么是MVC: 它是一种开发模式,是模型视图控制器的简称,所有 ...

  5. 第三十三篇:关于ES6,JSON和Webpack

    好家伙 1.什么是ES6? ECMAScript是javascript标准 ES6就是ECMAScript的第6个版本 (大概是一个语法标准规范) 2.什么是JSON? JSON 是什么,在数据交换中 ...

  6. Vim使用技巧(持续更新)

    好记性不如烂笔头,在这里记录一些Vim使用技巧 vim配置 "拷贝同步到系统剪切板" set clipboard=unnamed "显示行号" set nu & ...

  7. 华南理工大学 Python第1章课后小测

    1.(单选)计算机有两个基本特性:功能性和()性.(本题分数:5)A) 可存储B) 可计算C) 可通信D) 可编程您的答案:D  正确率:100%2.(单选)计算机硬件可以直接识别和执行的程序设计语言 ...

  8. 天天写SQL,这些神奇的特性你知道吗?

    摘要:不要歪了,我这里说特性它不是 bug,而是故意设计的机制或语法,你有可能天天写语句或许还没发现原来还能这样用,没关系我们一起学下涨姿势. 本文分享自华为云社区<[云驻共创]天天写 SQL, ...

  9. AQS:Java 中悲观锁的底层实现机制

    介绍 AQS AQS(AbstractQueuedSynchronizer)是 Java 并发包中,实现各种同步组件的基础.比如 各种锁:ReentrantLock.ReadWriteLock.Sta ...

  10. 获取客户端访问真实 IP

    转载自:https://www.qikqiak.com/post/get-client-realip/ 通常,当集群内的客户端连接到服务的时候,是支持服务的 Pod 可以获取到客户端的 IP 地址的, ...