hash表存在的意义:
了解hash表有助于我们了解hashmap的底层原理,在1.7及之前,hashmap用数组加链表完成它的底层建设。
首先我们得先有链表,然后将链表存放进专门存放链表的数组中。
话不多说,直接代码吧,以存放雇员为例。
package ACStudy.数据结构;
public class HashTableDemo {
public static void main(String[] args) {
//创建hashtable
HashTable hashTable = new HashTable(7);
hashTable.add(new Emp(2, "皮卡"));
hashTable.add(new Emp(3,"小智"));
hashTable.add(new Emp(9,"貔貅"));
hashTable.list();
Emp byid = hashTable.findByid(3);
System.out.println(byid);
}
}
class Emp{
public int id;
public String name;
public Emp next ;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
//创建hashTable管理多条链表
class HashTable{
private int size;
private EmpLinkedList[] empLinkedListArrays;
//构造器
public HashTable(int size){
this.size=size;
empLinkedListArrays =new EmpLinkedList[size];
//初始化每一条链表;
for (int i = 0; i < size; i++) {
empLinkedListArrays[i]=new EmpLinkedList();
}
}
public void add(Emp emp){
//根据员工的id,得到该员工应当添加到那条链表
int i = hashFun(emp.id);
empLinkedListArrays[i].add(emp);
}
//遍历所有的链表,遍立hashtable
public void list(){
//for (EmpLinkedList empLinkedListArray : empLinkedListArrays) {
// empLinkedListArray.list();
//}
for (int i = 0; i < empLinkedListArrays.length; i++) {
empLinkedListArrays[i].list();
}
}
public Emp findByid(int id){
int i = hashFun(id);
Emp empById = empLinkedListArrays[i].findEmpById(id);
return empById;
}
public int hashFun(int id){
return id%size;
}
}
//创建EmpLinkedList
class EmpLinkedList{
//头指针,执行第一个Emp因此我们这个链表的head是直接指向第一个Emp的
private Emp head;
//添加雇员到链表。
//说明
// 1、添加雇员时id是自增长,即id的分配总是从小到大,即加载链表的尾部。
public void add(Emp emp){
if (head==null){
head =emp;
return;
}
Emp curEmp =head;
while (curEmp.next!=null){
curEmp=curEmp.next;
}
curEmp.next =emp;
}
public void list(){
if (head==null) {
System.out.println("链表为空");
return;
}
Emp curEmp =head;
while (curEmp!=null){
int id = curEmp.id;
String name = curEmp.name;
System.out.printf("==>id=%d,name=%s", id,name);
curEmp=curEmp.next;
}
System.out.println();
}
public Emp findEmpById(int id){
if (head==null){
System.out.println("该链表为空,因此未找到该雇员");
return null;
}
Emp curemp =head;
while (curemp!=null){
if (curemp.id ==id){
break;
}else {
curemp = curemp.next;
}
}
return curemp;
}
}
注意:
在初始化数组的时候,也要同时将每一条链表初始化。