哈希表-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);
    }
}
目录
相关文章
|
2天前
|
存储 安全 Java
【亮剑】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能
【4月更文挑战第30天】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能。数据被分割成多个Segment,每个拥有独立锁,允许多线程并发访问不同Segment。当写操作发生时,计算键的哈希值定位Segment并获取其锁;读操作通常无需锁定。内部会根据负载动态调整Segment,减少锁竞争。虽然使用不公平锁,但Java 8及以上版本提供了公平锁选项。理解其工作原理对开发高性能并发应用至关重要。
|
2天前
|
存储 算法 安全
【Java编程进阶之路 02】深入探索:红黑树如何重塑哈希表的性能边界
JDK 1.8之后,HashMap引入红黑树来优化性能,当链表长度超过阈值(默认为8)时,链表会转换为红黑树,从而提高高冲突时的查询效率。同时,HashMap也采用了扰动函数来增加哈希值的随机性,使键值对更均匀分布,提升性能。
|
2天前
|
存储 缓存 安全
Java ConcurrentHashMap:线程安全的哈希表实现
Java ConcurrentHashMap:线程安全的哈希表实现
|
2天前
|
存储 缓存 Java
Java LinkedHashMap:保持插入顺序的哈希表解析
Java LinkedHashMap:保持插入顺序的哈希表解析
|
2天前
|
存储 缓存 安全
Java HashMap:哈希表原理、性能与优化
Java HashMap:哈希表原理、性能与优化
|
2天前
|
存储 Java Serverless
哈希表原理与Java HashSet、LinkedHashSet实现
哈希表原理与Java HashSet、LinkedHashSet实现
|
2天前
|
存储 Java Serverless
二叉搜索树 和 哈希表 (JAVA)
【1月更文挑战第1天】阿里云初体验 二叉搜索树 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的删除 哈希表 哈希冲突 闭散列 线性探测法 二次探测法 开散列 二叉搜索树又称二叉排序树,它具有以下性质的二叉树或空树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的每颗子树也分别为二叉搜索树 而哈希表是一种插入/删除/查找时间复杂度都是O(1)的数据结构,它的查询之所以也可以如此之快的的原因就是它在查找时不需要经过任何比较,直接一次从表中得到要搜索的元素。
39 0
二叉搜索树 和 哈希表 (JAVA)
|
2天前
|
存储 缓存 Java
java如何实现一个LRU(最近最少使用)缓存? 要求:设计一个LRU缓存,支持get和put操作。当缓存满时,需要淘汰最近最少使用的元素。要求使用双向链表+哈希表的数据结构来实现,并保证get和put操作的时间复杂度为O(1)。
java如何实现一个LRU(最近最少使用)缓存? 要求:设计一个LRU缓存,支持get和put操作。当缓存满时,需要淘汰最近最少使用的元素。要求使用双向链表+哈希表的数据结构来实现,并保证get和put操作的时间复杂度为O(1)。
29 1
|
7月前
|
存储 缓存 安全
【JavaSE专栏55】Java集合类HashTable解析,基于哈希表实现的唯一性键值对存储数据结构
【JavaSE专栏55】Java集合类HashTable解析,基于哈希表实现的唯一性键值对存储数据结构
|
7月前
|
存储 缓存 安全
【JavaSE专栏53】Java集合类HashMap解析,基于哈希表的键值对存储结构
【JavaSE专栏53】Java集合类HashMap解析,基于哈希表的键值对存储结构