/**
* 存储的对象
*/
@Data
public class Emp {
private Integer id;
private String name;
private Emp next;
public Emp(Integer id, String name, Emp next) {
this.id = id;
this.name = name;
this.next = next;
}
}
/**
* 链表
*/
public class EmpLinkedList {
private Emp head;
public void add(Emp emp) {
if (head == null) {
head = emp;
return;
}
Emp currentEmp = head;
while (currentEmp.getNext() == null) {
currentEmp = currentEmp.getNext();
}
currentEmp.setNext(emp);
}
public void list(Integer i) {
if (head == null) {
System.out.println("第"+(i+1)+"个链表为空");
return;
}
System.out.print("第"+(i+1)+"个链表内容-->");
Emp currentEmp = head;
while (currentEmp != null) {
System.out.println("id:" + currentEmp.getId() + "名字:" + currentEmp.getName());
currentEmp = currentEmp.getNext();
}
}
}
/**
* 数组+链表实现HashTable
*/
public class HashTable {
//数组+链表
private EmpLinkedList[] empLinkedListArray;
//散列函数要用
private Integer size;
//构造函数
public HashTable(Integer size) {
empLinkedListArray = new EmpLinkedList[size];
this.size = size;
//注意:这里要初始化每一个链表
for (int i = 0; i < size; i++) {
empLinkedListArray[i] = new EmpLinkedList();
}
}
/**
* 添加
*
* @param emp
*/
public void add(Emp emp) {
//确定该员工要放在哪个链表
Integer num = hashFun(emp.getId());
empLinkedListArray[num].add(emp);
}
/**
* 查询
*/
public void list() {
for (int i = 0; i < size; i++) {
empLinkedListArray[i].list(i);
}
}
/**
* 散列函数,由多种实现方案,这里选择最简单的取模方式
*
* @param id
* @return
*/
private Integer hashFun(Integer id) {
return id % size;
}
}
//测试
public class HashTableDemo {
public static void main(String[] args) {
Emp emp1 = new Emp(1,"1",null);
Emp emp3 = new Emp(3,"3",null);
Emp emp4 = new Emp(4,"4",null);
Emp emp2347 = new Emp(2347,"2347",null);
HashTable hashTable = new HashTable(7);
hashTable.add(emp1);
hashTable.add(emp3);
hashTable.add(emp4);
hashTable.add(emp2347);
hashTable.list();
}
结果
第1个链表为空
第2个链表内容-->id:1名字:1
第3个链表内容-->id:2347名字:2347
第4个链表内容-->id:3名字:3
第5个链表内容-->id:4名字:4
第6个链表为空
第7个链表为空