基本介绍
散列表(hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,它通过关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫散列函数,存放记录的数组叫散列表。
哈希表管理学生信息概图
示例代码
@Data
public class Student {
private int id;
private String name;
private String sex;
private String address;
private Student next;
@Override
public String toString ( ) {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}' ;
}
public Student ( int id, String name, String sex, String address) {
this . id = id;
this . name = name;
this . sex = sex;
this . address = address;
}
}
public class StudentLinkedList {
private Student head;
public void add ( Student student) {
if ( student == null) {
return ;
}
if ( isEmpty ( ) ) {
head = student;
return ;
}
Student temp = head;
while ( true ) {
if ( temp. getNext ( ) == null) {
break ;
}
temp = temp. getNext ( ) ;
}
temp. setNext ( student) ;
}
public void show ( ) {
if ( head == null) {
System. out. println ( "链表为空" ) ;
return ;
}
Student temp = head;
while ( true ) {
System. out. println ( temp) ;
if ( temp. getNext ( ) == null) {
break ;
}
temp = temp. getNext ( ) ;
}
}
public boolean isEmpty ( ) {
return head == null;
}
public Student findById ( int no) {
if ( isEmpty ( ) ) {
System. out. println ( "当前链表为空" ) ;
return null;
}
Student temp = head;
while ( true ) {
if ( temp. getId ( ) == no) {
break ;
}
if ( temp. getNext ( ) == null) {
temp = null;
break ;
}
temp = temp. getNext ( ) ;
}
return temp;
}
public void remove ( int id) {
if ( isEmpty ( ) ) {
return ;
}
if ( head. getId ( ) == id) {
head = head. getNext ( ) ;
return ;
}
Student temp = head;
while ( true ) {
if ( temp == null) {
break ;
}
if ( temp. getNext ( ) . getId ( ) == id) {
temp. setNext ( temp. getNext ( ) . getNext ( ) ) ;
break ;
}
temp = temp. getNext ( ) ;
}
}
}
public class HashTable {
private StudentLinkedList[ ] studentLinkedListArray;
private int size = 16 ;
public HashTable ( ) {
studentLinkedListArray = new StudentLinkedList [ size] ;
innitHashTable ( studentLinkedListArray) ;
}
public HashTable ( int size) {
this . size = size;
studentLinkedListArray = new StudentLinkedList [ size] ;
innitHashTable ( studentLinkedListArray) ;
}
public void add ( Student student) {
if ( student == null) {
return ;
}
studentLinkedListArray[ hashFun ( student. getId ( ) ) ] . add ( student) ;
}
public Student findById ( int no) {
return studentLinkedListArray[ hashFun ( no) ] . findById ( no) ;
}
public void removeById ( int no) {
studentLinkedListArray[ hashFun ( no) ] . remove ( no) ;
}
private void innitHashTable ( StudentLinkedList[ ] studentLinkedListArray) {
if ( studentLinkedListArray == null || studentLinkedListArray. length == 0 ) {
return ;
}
for ( int i = 0 ; i < studentLinkedListArray. length; i++ ) {
studentLinkedListArray[ i] = new StudentLinkedList ( ) ;
}
}
public void show ( ) {
System. out. println ( "链表下的元素为:" ) ;
for ( int i = 0 ; i < size; i++ ) {
System. out. printf ( "第 %d 条链表 =>:" , i) ;
studentLinkedListArray[ i] . show ( ) ;
}
}
private int hashFun ( int id) {
return id % size;
}
}