江的福从零开始刷算法(哈希表)

hash表存在的意义:
在这里插入图片描述
在这里插入图片描述
了解hash表有助于我们了解hashmap的底层原理,在1.7及之前,hashmap用数组加链表完成它的底层建设。

首先我们得先有链表,然后将链表存放进专门存放链表的数组中。
话不多说,直接代码吧,以存放雇员为例。

package ACStudy.数据结构;

public class HashTableDemo {
    public static void main(String[] args) {
        //创建hashtable
        HashTable hashTable = new HashTable(7);
        hashTable.add(new Emp(2, "皮卡"));
        hashTable.add(new Emp(3,"小智"));
        hashTable.add(new Emp(9,"貔貅"));
        hashTable.list();
        Emp byid = hashTable.findByid(3);
        System.out.println(byid);
    }
}
class Emp{
    public int id;
    public String name;
    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 + '\'' +
                '}';
    }
}

//创建hashTable管理多条链表
class HashTable{
    private  int size;
    private EmpLinkedList[] empLinkedListArrays;
    //构造器
    public HashTable(int size){
        this.size=size;
        empLinkedListArrays =new EmpLinkedList[size];
        //初始化每一条链表;
        for (int i = 0; i < size; i++) {
            empLinkedListArrays[i]=new EmpLinkedList();
        }
    }
    public void  add(Emp emp){
        //根据员工的id,得到该员工应当添加到那条链表
        int i = hashFun(emp.id);
        empLinkedListArrays[i].add(emp);
    }
    //遍历所有的链表,遍立hashtable
    public void list(){
        //for (EmpLinkedList empLinkedListArray : empLinkedListArrays) {
        //    empLinkedListArray.list();
        //}
        for (int i = 0; i < empLinkedListArrays.length; i++) {
            empLinkedListArrays[i].list();
        }

    }
    public Emp findByid(int id){
        int i = hashFun(id);
        Emp empById = empLinkedListArrays[i].findEmpById(id);
        return empById;
    }
    public int hashFun(int id){
        return  id%size;
    }
}




//创建EmpLinkedList
class  EmpLinkedList{

    //头指针,执行第一个Emp因此我们这个链表的head是直接指向第一个Emp的
    private  Emp head;

    //添加雇员到链表。
    //说明
    // 1、添加雇员时id是自增长,即id的分配总是从小到大,即加载链表的尾部。
    public  void add(Emp emp){
        if (head==null){
            head =emp;
            return;
        }
      
        Emp curEmp =head;
        while (curEmp.next!=null){
            curEmp=curEmp.next;
        }
        curEmp.next =emp;
    }
    public  void list(){
        if (head==null) {
            System.out.println("链表为空");
            return;
        }
        Emp curEmp =head;

        while (curEmp!=null){
            int id = curEmp.id;
            String name = curEmp.name;
            System.out.printf("==>id=%d,name=%s", id,name);
            curEmp=curEmp.next;

        }
        System.out.println();
    }
    public Emp findEmpById(int id){
        if (head==null){

            System.out.println("该链表为空,因此未找到该雇员");
            return null;
        }
        Emp curemp =head;
        while (curemp!=null){
            if (curemp.id ==id){
                break;
            }else {
                curemp = curemp.next;
            }
        }
        return curemp;

    }
}

注意:
在初始化数组的时候,也要同时将每一条链表初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值