一.简介
哈希表是一种线性结构,可用数组进行模拟
图:
二.使用数组+链表模拟哈希表
1.创建Student类
/**
* 使用Student类作为哈希表中链表的节点
*/
public class Student {
/**
* 学生id
*/
public int id;
/**
* 学生姓名
*/
public String name;
/**
* 下一个节点
*/
public Student nextNode;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
2.创建StudentLinked类
public class StudentLinked {
/**
* 链表的第一个节点
*/
public Student head;
/**
* 添加一个节点到链表中
*/
public void addNode(Student student){
Student temp = head;
if (head == null){
head = student;
return;
}
while (true){
if (temp.nextNode == null){
temp.nextNode = student;
return;
}else{
if (temp.nextNode.id == student.id){
System.out.println(student+"元素重复");
return;
}
}
temp = temp.nextNode;
}
}
/**
* 查询链表中所有的数据
*/
public void queryAllNode(int i){
System.out.println(i+"链表=================");
Student temp = head;
if (temp == null){
System.out.print(i+",链表为空");
return;
}
while (true){
System.out.print(temp+" ");
if (temp.nextNode == null){
return;
}
temp = temp.nextNode;
}
}
/**
* 根据id查询Student对象
*/
public void queryNodeById(int id){
Student temp = head;
if (temp==null){
System.out.println("空链表");
}
while (true){
if (temp.id == id){
System.out.println(temp);
return;
}
if (temp.nextNode == null){
System.out.println("没有该元素");
return;
}
temp = temp.nextNode;
}
}
}
3.创建HashTable类
public class HashTable {
/**
* 哈希表中的数组
*/
public StudentLinked[] studentLinkedArray;
/**
* 数组的大小
*/
public int arraySize;
/**
* 创建指定大小的数组,数组中的元素是链表
*/
public HashTable(int arraySize){
this.arraySize = arraySize;
studentLinkedArray = new StudentLinked[arraySize];
for (int i=0;i<arraySize;i++){
studentLinkedArray[i] = new StudentLinked();
}
}
/**
* 哈希函数
*/
public int currentHashCode(int id){
return id%arraySize;
}
/**
* 添加节点到哈希表中
*/
public void addElementHashTable(Student student){
int i = currentHashCode(student.id);
studentLinkedArray[i].addNode(student);
}
/**
* 查询哈希表中所有的元素
*/
public void queryAllEleHashTable(){
for (int i=0;i<arraySize;i++){
studentLinkedArray[i].queryAllNode(i);
System.out.println();
}
}
/**
* 根据Student的id查询
*/
public void queryHashTableById(int id){
int i = currentHashCode(id);
studentLinkedArray[i].queryNodeById(i);
}
}