1.哈希表介绍:
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
2.哈希表原理:
3.案例分析:
添加一个学生到校园系统中去,输入学生学号可以查找出该学生所有信息。
要求:
1.添加学生编号时按照从低到高的顺序
2.使用链表来实现哈希表,该链表不带表头
4.简单流程图
5.代码实现:
package hashtable;
/**
* @author WuChenGuang
*/
public class Student {
public int id;
public String name;
/**
* 指向下一个结点指针
*/
public Student next;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
package hashtable;
/**
* @author WuChenGuang
*/
public class StudentLinkedList {
private Student head;
/**
* 添加结点
*/
public void add(Student newStudent) {
// 1.如果添加时是第一个学生对象,则直接复制给第一个节点
if (head == null) {
head = newStudent;
return;
}
Student temp = head;
while (temp.next != null) {
// 继续往后查找
temp = temp.next;
}
// 追加了新的结点
temp.next = newStudent;
}
/**
* 学生列表
*/
public void list(int no) {
if (head == null) {
System.out.println("第" + no + "链表是空...");
return;
}
Student temp = head;
while (true) {
System.out.printf("id=%d name=%s\t", temp.id, temp.name);
if (temp.next == null) {
break;
}
temp = temp.next;
}
System.out.println();
}
/**
* 根据学员编号查询结点 id
*/
public Student findById(int id) {
if (head == null) {
System.out.println("空链表...");
return null;
}
Student temp = head;
while (true) {
if (temp.id == id) {
break;
}
if (temp.next == null) {
temp = null;
break;
}
temp = temp.next;
}
return temp;
}
}
package hashtable;
/**
* @author WuChenGuang
*/
public class HashTable {
private final StudentLinkedList[] studentLinkedLists;
private final int size;
public HashTable(int size) {
this.size = size;
studentLinkedLists = new StudentLinkedList[size];
// 数组中添加链表对象
for (int i = 0; i < size; i++) {
studentLinkedLists[i] = new StudentLinkedList();
}
}
/**
* 哈希函数
*/
public int hashCodes(int sid) {
return sid % size;
}
/**
* 添加学员
*/
public void add(Student student) {
// 决定了是数组中的下标
int hashVal = hashCodes(student.id);
// 添加到指定的链表中
studentLinkedLists[hashVal].add(student);
}
/**
* 查看哈希表中的元素
*/
public void list() {
for (int i = 0; i < size; i++) {
studentLinkedLists[i].list(i);
}
}
/**
* 根据学员编号查询
*/
public void findByStudentId(int sid) {
int hashVal = hashCodes(sid);
Student students = studentLinkedLists[hashVal].findById(sid);
if (students != null) {
System.out.printf("在第%d条链表中找到了学员编号是:%d\n", (hashVal + 1), sid);
} else {
System.out.println("整个hash表中未找到学员");
}
}
}
package hashtable;
/**
* @author WuChenGuang
*/
public class TestApp {
public static void main(String[] args) {
HashTable hashTable = new HashTable(10);
// 添加学员节点
Student student1 = new Student(1,"张三");
Student student2 = new Student(2,"李四");
Student student3 = new Student(3,"王五");
Student student4 = new Student(4,"周六");
Student student5 = new Student(4,"小七");
hashTable.add(student1);
hashTable.add(student2);
hashTable.add(student3);
hashTable.add(student4);
hashTable.add(student5);
hashTable.list();
hashTable.findByStudentId(4);
}
}
运行结果: