【数据结构】哈希表原理及其实现

简介: 【数据结构】哈希表原理及其实现

一、哈希表介绍

散列表(Hash table也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。

通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

二、代码实现

package work.rexhao.hashtab;

/**
 * 哈希表
 *
 * @author 王铭颢
 * @Date 2022/7/4 23:12
 */
public class HashTabDemo {
   
    public static void main(String[] args) {
   
        hashTab ht = new hashTab();
        ht.add(new stu(10,"wmh","123123"));
        ht.add(new stu(20,"wc","123123"));
        System.out.println(ht.find(10));
        System.out.println(ht.find(20));
        System.out.println(ht.find(30));
    }
}

/**
 * student的实体类
 */
class stu {
   
    private Integer no;
    private String name;
    private String phone;
    public stu next;

    stu(Integer no, String name, String phone) {
   
        this.no = no;
        this.name = name;
        this.phone = phone;
    }

    @Override
    public String toString() {
   
        return "stu{" + "no=" + no + ", name='" + name + '\'' + ", phone='" + phone + '\'' + '}';
    }

    public Integer getNo() {
   
        return no;
    }


    public String getName() {
   
        return name;
    }

    public String getPhone() {
   
        return phone;
    }

    public void setName(String name) {
   
        this.name = name;
    }


    public void setNo(Integer no) {
   
        this.no = no;
    }

    public void setPhone(String phone) {
   
        this.phone = phone;
    }
}

/**
 * hashTab
 */
class hashTab {
   
    // 链表节点头部分
    stu[] head = new stu[10];

    /**
     * 添加节点的方法(尾插法) 将最后的next域指向新的node
     */
    public void add(stu s) {
   
        if (s == null) {
   
            return;
        }
        // 没有头指针,第一次添加需要直接放进head里面
        if(head[s.getNo() % 10] == null){
   
            head[s.getNo() % 10] = s;
            return;
        }
        // 需要一个辅助变量
        stu temp = head[s.getNo() % 10];
        // 遍历单链表
        while (temp.next != null) {
   
            temp = temp.next;
        }
        // 退出循环时,temp指向最后
        temp.next = s;
    }

    /**
     * 查找
     */
    public stu find(int no) {
   
        // 判空
        if (head[no % 10] == null) {
   
            return null;
        }
        // 遍历
        stu temp = head[no % 10];
        while (temp != null) {
   
            if (temp.getNo() == no) {
   
                break;
            }
            temp = temp.next;
        }
        return temp;
    }
}
目录
相关文章
|
1月前
|
算法 Java 数据库
数据结构与算法学习十五:哈希表
这篇文章详细介绍了哈希表的概念、应用实例、实现思路,并提供了使用Java实现的哈希表代码。
53 0
数据结构与算法学习十五:哈希表
|
5月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
83 1
|
2月前
|
存储 Java Serverless
【数据结构】哈希表&二叉搜索树详解
本文详细介绍了二叉搜索树和哈希表这两种数据结构。二叉搜索树是一种特殊二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的特点,并且不允许键值重复。文章给出了插入、删除和搜索等方法的具体实现。哈希表则通过哈希函数将键名映射为数组下标,实现快速查找,其插入、删除和查找操作时间复杂度理想情况下为O(1)。文中还讨论了哈希函数的设计原则、哈希冲突的解决方法及哈希表的实现细节。
48 8
【数据结构】哈希表&二叉搜索树详解
|
5月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
97 0
|
1月前
|
消息中间件 存储 Java
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
29 4
|
1月前
|
存储 缓存 Java
【数据结构】哈希表
【数据结构】哈希表
27 1
|
2月前
|
设计模式 安全 Java
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
假如有T1、T2两个线程同时对某链表扩容,他们都标记头结点和第二个结点,此时T2阻塞,T1执行完扩容后链表结点顺序反过来,此时T2恢复运行再进行翻转就会产生环形链表,即B.next=A;采用2的指数进行扩容,是为了利用位运算,提高扩容运算的效率。JDK8中,HashMap采用尾插法,扩容时链表节点位置不会翻转,解决了扩容死循环问题,但是性能差了一点,因为要遍历链表再查到尾部。例如15(即2^4-1)的二进制为1111,31的二进制为11111,63的二进制为111111,127的二进制为1111111。
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
|
1月前
|
搜索推荐 索引
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(二)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
1月前
|
搜索推荐 C++
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(一)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
1月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
28 0

热门文章

最新文章