java哈希表

散列表(Hash Table)也叫哈希表

哈希表是数组和链表各取其优点的

他是一个数组 通过某种哈希算法得出哈希值

放入的元素通过哈希值来确定下标位置

如果出现放入的元素的哈希值重复这种情况

则哈希表采用了在数组下标中建立链表的方式存放元素

 通过创建哈希表模拟学生信息存放:

首先创建学生类

类中有个指针指向下个结点方便形成链表

public class Student {
    private int id;//学生ID

    private String name;//学生姓名

    public Student next;//用来指向下个学生结点的指针

    //以下是构造方法和get set方法
    public Student(int id, String name) {
        this.id = id;
        this.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 class StudentLindList {
    public Student head;//每个哈希表下标链表的头结点
    public StudentLindList() {//构造方法
    }
    public void add(Student student){
        if(this.head==null){//判断链表是否为空 如果没有元素那就将第一个元素给头结点
            this.head=student;
        }else{//如果有元素就迭代链表
            Student temp=head;
            while(temp.next!=null){
                temp=temp.next;
            }
            temp.next=student;
        }
    }

    public void List(int no){//迭代此链表的所有元素
        if(this.head==null){//判断链表是否为空
            return;
        }
        Student temp=head;
        while(temp!=null){
            System.out.println("第"+(no+1)+"链表"+" "+"学生姓名为:"+temp.getName()+" "+"学生ID:"+temp.getId());
            temp=temp.next;
        }
    }

    public Student Find(int id){
        if(this.head==null){//判断链表是否为空
            return null;
        }
        Student temp=head;//进行链表迭代
        while(temp!=null){
            if(temp.getId()==id){//判断迭代的元素的ID是否等于要查找的ID
                return temp;//返回该结点
            }else{
                temp=temp.next;//迭代
            }
        }
        return null;//循环完到这里就等于没找到返回空
    }
}

最后创建链表数组

数组的每个元素就是一个完整的链表

public class MyHashTable {
    StudentLindList[] studentLindLists;//建立一个链表数组 数组中的每个元素是一个链表
    int capacity;//链表初始容量

    public MyHashTable(int size) {
        this.capacity=size;
        this.studentLindLists=new StudentLindList[this.capacity];//初始化数组
        for (int i = 0; i < capacity; i++) {//初始化数组的每个元素设置为链表
            studentLindLists[i]=new StudentLindList();
        }
    }

    /**
     * 哈希算法:
     * 通过学生的ID取模数组的容量保证数字不会超出数组的最大下标
     */
    public int HashSum(int id){
        return id%this.capacity;
    }


    public void add(Student student){
        int HashVal=HashSum(student.getId());//通过学生的ID计算出要放在那个下标的哈希值
        this.studentLindLists[HashVal].add(student);//放入元素调用链表的add
    }

    public void List(){//迭代数组展示所有链表的所有元素
        for (int i = 0; i < capacity; i++) {
            this.studentLindLists[i].List(i);//循环数组中每一个元素的list
        }
    }

    public void Find(int id){//查找元素
        for (int i = 0; i < capacity; i++) {
            Student student = this.studentLindLists[i].Find(id);//根据传进的ID调用每个链表的find返回Student
            if(student!=null) System.out.println(student.getName()+student.getId());//如果找到了打印姓名+ID
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值