栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java哈希表

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();
        }
    }

    
    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
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/271978.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号