哈希表-Java实现

简介: 哈希表

哈希算法,通过哈希函数得到一个值,只要key一样,value肯定会一样,但是哈希函数拟合的好,可以极大降低数据查找时间。


简单的实现,取模函数实现哈希表


 //插入操作

    public void insert(E key) {
   
        int index = hash(key);
        Node<E> head = TABLE[index];
        Node<E> node = new Node<E>(key);
        node.next = head.next;
        head.next = node;
    }


 //查找操作

    public boolean contains(E key){
   
        int index = hash(key);
        Node<E> node = TABLE[index].next;
        while (node != null){
   
            if (node.data.equals(key)){
   
                return true;
            }
            node = node.next;
        }
        return false;
    }


解决哈希冲突,就是多个数据占用一个位置,这里用链表将其连接起来

//初始化每一个头节点,用链表解决哈希冲突

    public HashTable(){
   
        for (int i = 0; i < TABLE_SIZE; i++) {
   
            TABLE[i] = new Node<>(null);
        }
    }

 private static class Node<E>{
   
        private final  E data;
        private Node<E> next;

        private Node(E data){
   
            this.data = data;
        }
    }


总览

package com.collection;

import org.w3c.dom.Node;

import java.util.Arrays;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/30 16:06
 */

public class HashTable<E> {
   

    private final int TABLE_SIZE = 10;
    private final Node<E>[] TABLE = new Node[TABLE_SIZE];

    //初始化每一个头节点,用链表解决哈希冲突

    public HashTable(){
   
        for (int i = 0; i < TABLE_SIZE; i++) {
   
            TABLE[i] = new Node<>(null);
        }
    }

    //插入操作

    public void insert(E key) {
   
        int index = hash(key);
        Node<E> head = TABLE[index];
        Node<E> node = new Node<E>(key);
        node.next = head.next;
        head.next = node;
    }

    //查找操作

    public boolean contains(E key){
   
        int index = hash(key);
        Node<E> node = TABLE[index].next;
        while (node != null){
   
            if (node.data.equals(key)){
   
                return true;
            }
            node = node.next;
        }
        return false;
    }

    private int hash(E key) {
   
        int hashCode = key.hashCode();
        return hashCode % TABLE_SIZE;
    }

    //出现哈希冲突

    private static class Node<E>{
   
        private final  E data;
        private Node<E> next;

        private Node(E data){
   
            this.data = data;
        }
    }


    @Override
    public String toString() {
   
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < TABLE_SIZE; i++) {
   
            Node<E> head = TABLE[i].next;
            while (head != null) {
   
                builder.append(head.data).append(" -> ");
                head = head.next;
            }
            builder.append("\n");
        }
        return builder.toString();
    }
}


测试

package com.collection;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/29 21:42
 */

public class Main {
   
    public static void main(String[] args) {
   
       HashTable<Integer> table = new HashTable<>();
       for (int i = 0;i < 100;i++){
   
           table.insert(i);
       }
        System.out.println(table);
    }
}
目录
相关文章
|
1月前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
6月前
|
存储 Java
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
|
8月前
|
存储 Java 索引
JAVA中的哈希表实现与应用
JAVA中的哈希表实现与应用
127 1
|
9月前
|
存储 Java Serverless
Java哈希表
Java哈希表
43 0
|
9月前
|
存储 安全 Java
【亮剑】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能
【4月更文挑战第30天】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能。数据被分割成多个Segment,每个拥有独立锁,允许多线程并发访问不同Segment。当写操作发生时,计算键的哈希值定位Segment并获取其锁;读操作通常无需锁定。内部会根据负载动态调整Segment,减少锁竞争。虽然使用不公平锁,但Java 8及以上版本提供了公平锁选项。理解其工作原理对开发高性能并发应用至关重要。
71 0
|
9月前
|
存储 缓存 安全
Java HashMap:哈希表原理、性能与优化
Java HashMap:哈希表原理、性能与优化
400 1
|
9月前
|
存储 算法 安全
【Java编程进阶之路 02】深入探索:红黑树如何重塑哈希表的性能边界
JDK 1.8之后,HashMap引入红黑树来优化性能,当链表长度超过阈值(默认为8)时,链表会转换为红黑树,从而提高高冲突时的查询效率。同时,HashMap也采用了扰动函数来增加哈希值的随机性,使键值对更均匀分布,提升性能。
96 0
|
9月前
|
存储 缓存 安全
Java ConcurrentHashMap:线程安全的哈希表实现
Java ConcurrentHashMap:线程安全的哈希表实现
188 0
|
9月前
|
存储 缓存 Java
Java LinkedHashMap:保持插入顺序的哈希表解析
Java LinkedHashMap:保持插入顺序的哈希表解析
174 0
|
9月前
|
存储 Java Serverless
哈希表原理与Java HashSet、LinkedHashSet实现
哈希表原理与Java HashSet、LinkedHashSet实现
125 0