什么是哈希表
哈希表就是一个数组加一个链表
数组的的每一个位置对应一个链表
通过取余的方式来确定一个数据往第几个链表里面放
简简单单写一个数据类
package Hashtable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
public class Emp {
private int id;
private String name;
private Emp next;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name +'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Emp getNext() {
return next;
}
public void setNext(Emp next) {
this.next = next;
}
}
简简单单写个链表
package Hashtable;
import lombok.Data;
public class EmpLinkedList {
private Emp head;
private Emp end;
public void add(Emp emp){
if(head == null){
head=emp;
end=emp;
}else{
end.setNext(emp);
end=emp;
}
}
public void deleteEmpById(int id){
Emp ep=head;
if(head==null){
System.out.println("链表为空");
}else{
//删除节点的时候我们要获取要删除节点的前一个节点
//然后把这前一个节点的next指向删除节点的后一个节点 这样就删除了
//这里处理的是首节点
if(ep.getId()==id){
if(ep.getNext()==null){
head=null;
}else{
Emp nep= ep.getNext();
ep.setNext(nep.getNext());
}
}else{
//这里处理的是非首节点
while(ep!=null) {
if (ep.getNext().getId() == id) {
Emp nep= ep.getNext();
ep.setNext(nep.getNext());
break;
} else {
ep = ep.getNext();
}
}
}
}
}
//遍历打印
public Emp getEmpById(int id){
Emp ep=head;
if(head==null){
System.out.println("链表为空");
return null;
}else{
while(ep!=null) {
if (ep.getId() == id) {
return ep;
} else {
ep = ep.getNext();
}
}
}
return null;
}
public void toStringEmp(){
Emp ep=head;
if(ep==null){
System.out.println("该emp链表为空");
}else{
while(ep!=null){
System.out.println(ep.toString());
if(ep.getNext()==null){
break;
}else{
ep=ep.getNext();
}
}
}
}
public Emp getHead() {
return head;
}
public void setHead(Emp head) {
this.head = head;
}
public Emp getEnd() {
return end;
}
public void setEnd(Emp end) {
this.end = end;
}
}
简简单单把链表放数组里面
package Hashtable;
public class myHashTable {
private EmpLinkedList[] empLinkedLists;
private int size ;
public myHashTable(int size) {
this.size = size;
this.empLinkedLists=new EmpLinkedList[size];
for (int i=0;i<size;i++){
empLinkedLists[i]=new EmpLinkedList();
}
}
public void add(Emp emp){
int hash = gethash(emp.getId());
empLinkedLists[hash].add(emp);
}
public void toStringAllEmp(){
for(int i=0;i<size;i++){
empLinkedLists[i].toStringEmp();
}
}
public void deleteEmpById(int id){
int hash = gethash(id);
empLinkedLists[hash].deleteEmpById(id);
}
public Emp getEmpById(int id){
int hash = gethash(id);
Emp empById = empLinkedLists[hash].getEmpById(id);
return empById;
}
//这里就是简单的哈希运算
public int gethash(int i){
return i%size;
}
}
简简单单的测试
package Hashtable;
import org.junit.Test;
public class test {
@Test
public void test(){
myHashTable myHashTable = new myHashTable(2);
myHashTable.add(new Emp(1,"tom"));
myHashTable.add(new Emp(2,"cat"));
myHashTable.add(new Emp(3,"jack"));
myHashTable.add(new Emp(3,"jack"));
myHashTable.toStringAllEmp();
System.out.println("==========");
myHashTable.deleteEmpById(3);
myHashTable.toStringAllEmp();
// Emp empById = myHashTable.getEmpById(1);
// String s = empById.toString();
// System.out.println(s);
}
}