你好!哈希表【JAVA】

1.初识🎶🎶🎶

它基本上是由一个数组和一个哈希函数组成的。哈希函数将每个映射到数组的特定索引位置,这个位置被称为哈希码。当我们需要查找一个键时,哈希函数会计算其哈希码并立即返回结果,因此我们可以直接访问该索引位置并读取或修改该键的值,从而实现快速查找。

2.案例分析 🎶🎶🎶

使用哈希表存储人员信息

3.创建人员 🎶🎶🎶

/**
 * 每一位人员
 */
class Emp {
    public int id;
    public String name;
    public Emp next;

    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

4.创建链表🎶🎶🎶

/**
 * 链表
 */
class EmpLinkList {
    private Emp head;//头节点

    /**
     * 添加员工
     */
    public void add(Emp emp) {
        if (head == null) {
            head = emp;
            return;
        }
        Emp temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;//指针后移
        }
        temp.next = emp;
    }

    /**
     * 遍历链表
     */
    public void list(int no) {
        if (head == null) {
            System.out.println("第" + (no + 1) + "条链表为空~");
            return;
        }
        Emp temp = head;
        while (true) {
            System.out.print("第" + (no + 1) + "链表" + "===>" + "当前用户id:" + temp.id + ",姓名:" + temp.name);
            if (temp.next == null) {
                break;
            }
            temp = temp.next;//指针后移
        }
        System.out.println();
    }

    /**
     * 查找人员
     */
    public Emp selectById(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return null;
        }
        Emp temp = head;
        while (true) {
            if (temp.id == id) {//找到
                break;
            }
            if (temp.next == null) {//链表结尾
                temp = null;
                break;
            }

            temp = temp.next;
        }
        return temp;
    }

    /**
     * 删除
     */
    public void delete(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        Emp temp = head;
        while (true) {
            if (temp.next.id == id) {//找到
                break;
            }
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = temp.next.next;
    }

5.创建哈希表🎶🎶🎶

/**
 * 哈希表
 */
class Hash {
    private EmpLinkList[] empLinkListArray;//定义个管理链表的数组
    private int size;//共有几条链表

    public Hash(int size) {
        this.size = size;
        empLinkListArray = new EmpLinkList[size];
        //初始化每一条链表
        for (int i = 0; i < size; i++) {
            empLinkListArray[i] = new EmpLinkList();
        }
    }

    /**
     * 添加人员
     */
    public void add(Emp emp) {
        //根据员工id,得到该员工应当添加到哪条链表
        int empLinkListNo = hashFun(emp.id);

        //将emp加入到对应的链表中
        empLinkListArray[empLinkListNo].add(emp);

    }

    /**
     * 遍历所有链表
     */
    public void list() {
        for (int i = 0; i < size; i++) {
            empLinkListArray[i].list(i);
        }
    }

    /**
     * 查找人员
     */
    public void select(int id) {
        //1.确定到哪条链表找
        int empLinkListNo = hashFun(id);
        Emp emp = empLinkListArray[empLinkListNo].selectById(id);
        if (emp != null) {
            System.out.println("在第" + (empLinkListNo + 1) + "条链表中找到," + "id=" + id + "的信息:" + emp);
        } else {
            System.out.println("未找到");
        }
    }

    /**
     * 删除人员
     */
    public void delete(int id) {
        int empLinkListNo = hashFun(id);
        empLinkListArray[empLinkListNo].delete(id);
    }

    /**
     * 编写散列函数取模)
     */
    public int hashFun(int id) {
        return id % size;
    }


}

6.测试🎶🎶🎶

  public static void main(String[] args) {
        Hash hash = new Hash(7);
        String key = "";
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入:");
            System.out.println("add:添加人员");
            System.out.println("list:显示人员");
            System.out.println("select:查找人员");
            System.out.println("delete:删除人员");
            System.out.println("exit:退出");
            key = scanner.next();
            switch (key) {
                case "add":
                    System.out.println("请输入id:");
                    int id = scanner.nextInt();
                    System.out.println("请输入姓名:");
                    String name = scanner.next();
                    Emp emp = new Emp(id, name);
                    hash.add(emp);
                    break;
                case "list":
                    hash.list();
                    break;
                case "select":
                    System.out.println("请输入你要查找的id:");
                    id = scanner.nextInt();
                    hash.select(id);
                    break;
                case "delete":
                    System.out.println("请输入要删除的id");
                    id = scanner.nextInt();
                    hash.delete(id);
                    break;
                case "exit":
                    System.out.println("谢谢使用~");
                    System.exit(0);
            }
        }

    }

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/220620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件之间的区别

一.单机吞吐量 ActiveMQ&#xff1a;万级&#xff0c;吞吐量比RocketMQ和Kafka要低了一个数量级 RabbitMQ&#xff1a;万级&#xff0c;吞吐量比RocketMQ和Kafka要低了一个数量级 RocketMQ&#xff1a;10万级&#xff0c;RocketMQ也是可以支撑高吞吐的一种MQ Kafka&#xff…

软件设计模式原则(六)依赖倒置原则

一.定义 依赖倒置原则&#xff08;Dependence Inversion Principle&#xff09;是程序要依赖于抽象接口&#xff0c;不要依赖于具体实现。简单的说就是要求对抽象进行编程&#xff0c;不要对实现进行编程&#xff0c;这样就降低了客户与实现模块间的耦合。 即&#xff1a;层次…

SpringBoot整合validation数据校验

1. 首先引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 点标识进去可以发现是通过Hibernate Validator使用 Java Bean Validation 2. 属性上…

用AI在抖音直播做姓氏头像的全新玩法,详细分析制作教程

前段时间在圈子里给大家分享了用AI写艺术字做小红书账号案例玩法&#xff0c;同学们都比较热衷学习。纷纷动手实践。 事实上用AI艺术字变现玩法还有许多。 例如上周末在星球给圈友们分享的一个AI艺术字直播的抖音账号&#xff0c;直播内容形式很简单&#xff0c;就是展现用AI…

从一个简单的实际例子看并行处理

在不使用并行处理之前 假如我有一个很大的tif图片 我想算一下这张图片中有多少的像素点是黑色的,我可能会这么做: def cnt_black(filename):img = tf.imread(filename)width, height, channels = img.shapecnt = 0for i in range(width):for j in range(height):r, g, b = …

12、SQL注入——SQL报错注入

文章目录 一、报错注入概述1.1 报错注入1.2 报错注入的前提条件1.3 相关报错函数 二、报错注入payload2.1 利用extractvalue()函数进行报错注入2.2 利用updataxml()函数进行报错注入2.3 利用floor()函数进行报错注入 一、报错注入概述 1.1 报错注入 通过构造特定的SQL语句&am…

coding创建远程分支。并拉取远程新分支+推送代码

进入coding ----项目----代码仓库---点击 下拉之后查看全部----创建分支 创建分支之后执行下面命令 git branch -a // 查看所有分支 这个时候发现自己创建的分支没有显示这是因为自己在远程创建了分支但是本地还没有分支 执行 git fetch命令 用于从远程仓库获取最新的提交…

【软件测试】技术精选:Jmeter常见的几种报错

1、Java.net.UnknownHostException 这个错的含义是 没有连接到服务器地址&#xff0c;因此很可能是 内部网络中断导致。 2、502 Bad gateway 这个和本地的线程数无关 可能原因是网络抖动不稳定导致 3、java.net.SocketException: Socket closed 强制停止线程&#xff0c;连接…

CSRF之pikachu靶场DW

1&#xff0c;登录皮卡丘靶场&#xff0c;get请求&#xff1b; 2&#xff0c;抓包并修改标记后的个人信息 最后放通一下&#xff0c;发现账号信息被修改 2&#xff0c;post请求 1提交post数据并使用bp抓包 2.利用工具改包&#xff0c;并生成url 3&#xff0c;点击提交后&#…

单调栈与单调队列算法总结

单调栈 知识概览 单调栈最常见的应用是找到每一个数离它最近的且比它小的数。单调栈考虑的方式和双指针类似&#xff0c;都是先想一下暴力做法是什么&#xff0c;然后再挖掘一些性质如单调性&#xff0c;最终可以把目光集中在比较少的状态中&#xff0c;从而达到降低时间复杂…

JAVA 线程池,及7大参数,4大拒绝策略详解

为什么要使用线程池 线程的生命周期&#xff1a;运行、就绪、运行、阻塞、死亡 下面是一个简单的创建多线程的方法。注意&#xff1a;工作中不可取。 创建线程的时候&#xff0c;我们避不开线程的生命周期。上面的方法虽然可以创建多线程&#xff0c;但是创建完成后&#xff0c…

智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.寄生捕食算法4.实验参数设定5.算法结果6.参考…

深入探讨Guava的缓存机制

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Google Guava的缓存机制。缓存在现代编程中的作用非常大&#xff0c;它能提高应用性能&#xff0c;减少数据库压力&#xff0c;简直就是性能优化的利器。而Guava提供的缓存功能&#xff0c;不仅强大…

vue el-select多选封装及使用

使用了Element UI库中的el-select和el-option组件来构建多选下拉框。同时&#xff0c;也包含了一个el-input组件用于过滤搜索选择项&#xff0c;以及el-checkbox-group和el-checkbox组件用于显示多选项。 创建组件index.vue (src/common-ui/selectMultiple/index.vue) <tem…

【优选算法系列】【专题一双指针】第四节.15. 三数之和和18. 四数之和

文章目录 前言一、三数之和 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、四数之和 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

什么是动态住宅IP?它有什么用途?

随着网络的迅速发展&#xff0c;许多人对代理IP已经有了比较深刻的认识&#xff0c;并且广泛地运用到了各自的业务中&#xff0c;尤其在跨境的相关业务中表现尤其卓越。对于代理IP的类别&#xff0c;也需要根据自己的业务类型具体选择最合适的&#xff0c;那么今天IPFoxy就给大…

【Vue】使用cmd命令创建vue项目

上一篇&#xff1a; node的安装与配置 https://blog.csdn.net/m0_67930426/article/details/134562278?spm1001.2014.3001.5502 目录 一.创建空文件夹专门存放vue项目 二. 查看node , npm 和vue脚手架的版本 三.安装vue脚手架 四.创建vue项目 五.运行项目 一.创建空文件…

File类—递归文件搜索执行脚本文件

文章目录 一、需求分析二、File类2.1 File对象的创建2.2 File判断和获取方法2.3 创建和删除方法2.4 遍历文件夹方法 三、Runtime类—常见api四、递归文件搜索执行脚本文件 一、需求分析 在本篇博客中&#xff0c;我们想通过递归文件的方式&#xff0c;在D:\\判断下搜索QQ.exe这…

Hadoop学习笔记(HDP)-Part.07 安装MySQL

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

生成式 AI 应用落地小结:高估的模型能力,低估的工程实施

虽然 ChatGPT 已经诞生了一周年&#xff0c;但是大量的人依旧对于生成式 AI 没有足够的认识。在研发领域&#xff0c;Thoughtworks 一直在与不同的大型企业合作&#xff0c;保持开放性的探索。 在我负责的 Thoughtworks 开源社区&#xff0c;我们与外部的几家大型企业一起探索和…