哈希表也称为散列表,是根据关键码值(Key value)而直接进行访问的数据结构。可通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
哈希表应用案例
添加一个学生到校园系统中,输入学生学号可以查找出该学生所有信息
描述成哈希表,链表基于数组
创建结点属性
package com.mei.hashtable;
//结点的属性
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 com.mei.hashtable;
//链表添加实现
//每一行的链表
public class StudentLinkedList {
//头结点
private Student head;
/*
* 添加节点
* */
public void add(Student newStudent){
//添加时是第一个结点
if (head==null){
head=newStudent;
return;
}
Student temp=head;
while (true){
if (temp.next==null){
break;
}
//继续往后查找
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 com.mei.hashtable;
public class HashTable {
//链表的数组
private StudentLinkedList[] studentLinkedLists;
private 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);
}
/*
*查看hash表中的元素 */
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);
}
}
}
测试
在编号4插入两个元素
package com.mei.hashtable;
import javax.swing.plaf.synth.SynthTableUI;
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);
}
}