HashTab基于链表简单实现(java,不包含扩容)

简介: HashTab基于链表简单实现(java,不包含扩容)

一、文件目录

二、代码

 
/**
 * 定义一个雇员
 */
public class Emp {
    public int id;
    public String name;
    //默认为null
    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 + '\'' +
                '}';
    }
}
 
/**
 * 表示链表
 */
public class EmpLinkedList {
    //    头指针,指向第一个Emp,默认为null
    private Emp head;
 
    /**
     * 添加雇员
     *
     * @param emp
     */
    public void add(Emp emp) {
        //添加第一个元素
        if (head == null) {
            head = emp;
            return;
        }
        Emp cur = head;
        while (cur.next != null) {
            cur = cur.next;
        }
        cur.next = emp;
    }
 
    /**
     * 输出链表内容
     */
    public void list(int no) {
        if (head == null) {
            System.out.println("当前" + no + "链表为空");
            return;
        }
        System.out.println("当前" + no + "链表的信息为:");
        //辅助指针
        Emp cur = head;
        while (true) {
            System.out.printf("=》id=%d name=%s\t", cur.id, cur.name);
            if (cur.next == null) {
                break;
            }
            cur = cur.next;
        }
        System.out.println();
    }
 
    /**
     * 根据id查找雇员
     * @param id
     * @return
     */
    public Emp findEmpById(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return null;
        }
        Emp cur = head;
        while (cur != null) {
            if (cur.id == id) {
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }
    public void del(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        Emp cur = head;
        //删除的位于第一个
        if(head.id==id){
            head=head.next;
            return ;
        }
        while (cur.next != null) {
            if (cur.next.id == id) {
                cur.next=cur.next.next;
                return;
            }
            cur = cur.next;
        }
    }
}
 
public class HashTab {
    private EmpLinkedList[] empLinkedList;
    private int size;
 
    public HashTab(int size) {
        //初始化
        this.size = size;
        empLinkedList = new EmpLinkedList[size];
        for (int i = 0; i < empLinkedList.length; i++) {
            empLinkedList[i] = new EmpLinkedList();
        }
    }
 
    /**
     * 添加雇员
     *
     * @param emp
     */
    public void add(Emp emp) {
        empLinkedList[hashFun(emp.id)].add(emp);
    }
 
    /**
     * 遍历所有链表
     */
    public void list() {
        for (int i = 0; i < size; i++) {
            empLinkedList[i].list(i);
        }
    }
 
    /**
     * 根据ID查找
     * @param id
     * @return
     */
    public Emp findEmpById(int id) {
        return empLinkedList[hashFun(id)].findEmpById(id);
    }
 
    /**
     * 根据ID删除
     * @param id
     */
    public void del(int id) {
        empLinkedList[hashFun(id)].del(id);
    }
 
    /**
     * 散列函数,取模法
     *
     * @param id
     * @return
     */
    public int hashFun(int id) {
        return id % size;
    }
 
}
import java.util.Scanner;
 
public class HashTabDemo {
    public static void main(String[] args) {
        //    创建哈希表
        HashTab hashTab = new HashTab(7);
        //    编写一个简单的菜单
        String key = "";
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop) {
            System.out.println("add:添加雇员");
            System.out.println("list:显示雇员");
            System.out.println("find:查找雇员");
            System.out.println("del:删除");
            System.out.println("exit:退出系统");
            key = scanner.next();
            int id;
            switch (key) {
                case "add":
                    System.out.println("输入id");
                    id = scanner.nextInt();
                    System.out.println("输入姓名");
                    String name = scanner.next();
                    hashTab.add(new Emp(id, name));
                    break;
                case "find":
                    System.out.println("输入id");
                    id = scanner.nextInt();
                    Emp empById = hashTab.findEmpById(id);
                    System.out.println(empById);
                    break;
                case "del":
                    System.out.println("输入id");
                    id = scanner.nextInt();
                    hashTab.del(id);
                    break;
                case "list":
                    hashTab.list();
                    break;
                case "exit":
                    loop = false;
                    scanner.close();
                    break;
            }
        }
    }
}

三、测试

D:\ProgramFiles\Java\jdk1.8.0_241\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=55054:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\charsets.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\deploy.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\access-bridge-64.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\cldrdata.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\dnsns.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\jaccess.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\jfxrt.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\localedata.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\nashorn.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunec.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunjce_provider.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunmscapi.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\sunpkcs11.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\ext\zipfs.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\javaws.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jce.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jfr.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jfxswt.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\jsse.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\management-agent.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\plugin.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\resources.jar;D:\ProgramFiles\Java\jdk1.8.0_241\jre\lib\rt.jar;F:\myCode\java\video\DataStructures\DataStructures\target\classes org.minos.hashtab.HashTabDemo
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
1
输入姓名
1
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
2
输入姓名
2
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
8
输入姓名
8
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
15
输入姓名
15
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
add
输入id
22
输入姓名
22
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=1 name=1 =》id=8 name=8 =》id=15 name=15 =》id=22 name=22 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
del
输入id
22
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=1 name=1 =》id=8 name=8 =》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
del
输入id
8
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=1 name=1 =》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
del
输入id
1
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
find
输入id
2
Emp{id=2, name='2'}
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
list
当前0链表为空
当前1链表的信息为:
=》id=15 name=15 
当前2链表的信息为:
=》id=2 name=2 
当前3链表为空
当前4链表为空
当前5链表为空
当前6链表为空
add:添加雇员
list:显示雇员
find:查找雇员
del:删除
exit:退出系统
相关文章
|
10天前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
1月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
22 3
|
6月前
|
存储 Java
Java数据结构:链表
Java数据结构:链表
45 2
|
5月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
3月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
101 0
|
3月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
54 0
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
44 0
|
6月前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
5月前
|
存储 安全 Java
深入解析Java HashMap的高性能扩容机制与树化优化
深入解析Java HashMap的高性能扩容机制与树化优化
146 1
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
50 2