怎样简简单单的用java手写个哈希表

本文介绍了一种简单的哈希表实现方法,包括自定义员工数据类、链表类及哈希表类。通过示例代码展示了如何使用取余运算进行哈希计算,将数据存储在数组中的链表里,并提供了添加、删除、查找等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是哈希表

哈希表就是一个数组加一个链表
数组的的每一个位置对应一个链表
通过取余的方式来确定一个数据往第几个链表里面放

简简单单写一个数据类

package Hashtable;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;



public class Emp {
    private int id;
    private String name;
    private 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 int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Emp getNext() {
        return next;
    }

    public void setNext(Emp next) {
        this.next = next;
    }
}

简简单单写个链表

package Hashtable;

import lombok.Data;


public class EmpLinkedList {
   private Emp head;
   private Emp end;
   
   public void add(Emp emp){
      if(head == null){
         head=emp;
         end=emp;
      }else{
         end.setNext(emp);
         end=emp;
      }

   }

   public void deleteEmpById(int id){
      Emp ep=head;
      if(head==null){
         System.out.println("链表为空");

      }else{
		//删除节点的时候我们要获取要删除节点的前一个节点 
		//然后把这前一个节点的next指向删除节点的后一个节点 这样就删除了
		//这里处理的是首节点
         if(ep.getId()==id){
            if(ep.getNext()==null){
               head=null;
            }else{
               Emp nep= ep.getNext();
               ep.setNext(nep.getNext());
            }

         }else{
		//这里处理的是非首节点
            while(ep!=null) {
               if (ep.getNext().getId() == id) {
                  Emp nep= ep.getNext();
                  ep.setNext(nep.getNext());
                  break;
               } else {
                  ep = ep.getNext();
               }

            }

         }

         }




   }

   //遍历打印
   public Emp getEmpById(int id){
      Emp ep=head;
      if(head==null){
         System.out.println("链表为空");
         return null;
      }else{
         while(ep!=null) {

            if (ep.getId() == id) {
               return ep;
            } else {
               ep = ep.getNext();
            }
         }
      }
      return null;
   }

   public void toStringEmp(){
       Emp ep=head;
      if(ep==null){
         System.out.println("该emp链表为空");
        
      }else{
         while(ep!=null){
            System.out.println(ep.toString());
            if(ep.getNext()==null){

               break;
            }else{
               ep=ep.getNext();
            }

         }
      }

   }



   public Emp getHead() {
      return head;
   }

   public void setHead(Emp head) {
      this.head = head;
   }

   public Emp getEnd() {
      return end;
   }

   public void setEnd(Emp end) {
      this.end = end;
   }
}

简简单单把链表放数组里面

package Hashtable;

public class myHashTable {
    private EmpLinkedList[] empLinkedLists;
    private int size ;
    public myHashTable(int size) {
        this.size = size;
        this.empLinkedLists=new EmpLinkedList[size];
        for (int i=0;i<size;i++){
            empLinkedLists[i]=new EmpLinkedList();
        }
    }
    public void add(Emp emp){
        int hash = gethash(emp.getId());


        empLinkedLists[hash].add(emp);
    }

    public void toStringAllEmp(){
        for(int i=0;i<size;i++){
             empLinkedLists[i].toStringEmp();
        }
    }

    public void deleteEmpById(int id){
        int hash = gethash(id);
       empLinkedLists[hash].deleteEmpById(id);
    }

    public Emp getEmpById(int id){
        int hash = gethash(id);
        Emp empById = empLinkedLists[hash].getEmpById(id);
        return empById;

    }
		//这里就是简单的哈希运算
    public int gethash(int i){
        return i%size;
    }

}

简简单单的测试

package Hashtable;

import org.junit.Test;

public class test {
    @Test
    public void test(){
        myHashTable myHashTable = new myHashTable(2);
        myHashTable.add(new Emp(1,"tom"));
        myHashTable.add(new Emp(2,"cat"));
        myHashTable.add(new Emp(3,"jack"));
        myHashTable.add(new Emp(3,"jack"));
       myHashTable.toStringAllEmp();
        System.out.println("==========");
        myHashTable.deleteEmpById(3);
        myHashTable.toStringAllEmp();

//        Emp empById = myHashTable.getEmpById(1);
//        String s = empById.toString();
//        System.out.println(s);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值