散列表(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
}
}
}