数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储

简介: 这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。

哈希表

解释

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

内存结构分析图

  • 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;//移动节点
//        }
//
//    }

在这里插入图片描述

相关文章
|
23天前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
115 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
133 3
|
3月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
58 3
|
3月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
107 1
|
3月前
|
算法 Java 数据库
数据结构与算法学习十五:哈希表
这篇文章详细介绍了哈希表的概念、应用实例、实现思路,并提供了使用Java实现的哈希表代码。
84 0
数据结构与算法学习十五:哈希表
|
16天前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
37 7
|
21天前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
44 10
|
23天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充

热门文章

最新文章