【java】HashTable和哈希表
程序员文章站
2022-03-20 23:02:11
/*** 哈希表实现思路 : 主要脑子里有实现链表的思路就不难。* hash表真的像常背的面试题一样,主要构成:数组 + 链表* 1.HashTable 比 链表 多一个hash方法(关键)* 2.HashTable 对底层实现的链表 又包装了一层* 3.HashTable里保存LinkedList引用。* 4.链表 在 HashTable 里的表现形式又是 数组。* * PS:这只是Hash表的一个最简单实现,基于此可以继续完善。* 至于 hash 的多种方式实现。都可以在此基础上进行....
/**
* 哈希表实现思路 : 主要脑子里有实现链表的思路就不难。
* hash表真的像常背的面试题一样,主要构成:数组 + 链表
* 1.HashTable 比 链表 多一个hash方法(关键)
* 2.HashTable 对底层实现的链表 又包装了一层
* 3.HashTable里保存LinkedList引用。
* 4.链表 在 HashTable 里的表现形式又是 数组。
*
* PS:这只是Hash表的一个最简单实现,基于此可以继续完善。
* 至于 hash 的多种方式实现。都可以在此基础上进行完善修改。
*
*/
public class HashTabDemo {
public static void main(String[] args) {
HashTab tab = new HashTab(7);
tab.add(new Emp(1, "小李"));
tab.add(new Emp(5, "我爱罗"));
tab.add(new Emp(8, "鸣人"));
tab.add(new Emp(100, "假粉丝"));
tab.add(new Emp(1030, "桥鸟"));
tab.list();
tab.findEmpByID(100);
tab.findEmpByID(8);
tab.findEmpByID(99);
tab.delete(8);
tab.list();
System.out.println();
tab.delete(1030);
tab.delete(1);
tab.delete(100);
tab.delete(5);
System.out.println();
tab.list();
}
}
/**
* 用于测试功能的简易版员工类
*/
class Emp{
int id;
String name;
int age;
Emp next;
public Emp(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + "]";
}
}
class HashTab{
private int size;
private EmpLinkedList[] lists;
public HashTab(int size) {
this.size = size;
lists = new EmpLinkedList[size];
for (int i = 0; i < lists.length; i++) {
lists[i] = new EmpLinkedList();
}
}
public void add( Emp emp ) {
int num = hash(emp.id);
lists[num].add(emp);
}
public void list() {
for (int i = 0; i < lists.length; i++) {
lists[i].list();
}
}
public Emp findEmpByID( int id ) {
int num = hash(id);
Emp temp = lists[num].findEmpByID(id);
if( temp !=null ) {
System.out.println( "在第"+ num + "条链表中存在该雇员,雇员姓名:" + temp.name );
}else {
System.out.println( "该编号雇员不存在" );
}
return temp;
}
public boolean delete(int id) {
int num = hash(id);
return lists[num].delete(id);
}
public int hash( int id ) {
return id % size;
}
}
class EmpLinkedList{
private Emp head;
/**
* 添加元素到链表
* @param emp
*/
public void add(Emp emp) {
if( head == null ) {
head = emp;
//添加完成应该返回
return;
}
Emp temp = head;
while(true) {
if( temp.next == null ) {
break;
}
temp = temp.next;
}
temp.next = emp;
}
/**
* 显示所有链表信息
*/
public void list() {
if( head == null ) {
System.out.println( "当前链表为空~" );
return;
}
Emp curEmp = head;
while(true) {
System.out.print( curEmp + " " );
if( curEmp.next ==null ) {
break;
}
curEmp = curEmp.next;
}
System.out.println();
}
//public void update();
/**
* 根据id删除链表元素
* @param id
* @return
*/
public boolean delete(int id) {
if( head == null ) {
System.out.println("当前链表为空~");
return false;
}
Emp curPre = null;
Emp curEmp = head;
while( true ) {
if( curEmp.id == id ) {
if( head.next == null ) {
head = null;
}else {
curPre.next = curEmp.next;
}
break;
}else {
curPre = curEmp;
}
curEmp = curEmp.next;
}
return true;
}
/**
* 根据id查询链表元素
* @param id
* @return
*/
public Emp findEmpByID( int id ) {
if( head == null ) {
System.out.println( "当前链表为空" );
return null;
}
Emp emp = head;
while(true) {
if( emp.id == id ) {
break;
}
emp = emp.next;
if( emp.next == null ) {
emp = null;
break;
}
}
return emp;
}
}
本文地址:https://blog.csdn.net/zhao123sun/article/details/110254183
推荐阅读
-
java中Hashtable和HashMap的区别分析
-
C#使用foreach遍历哈希表(hashtable)的方法
-
Java自学-集合框架 HashMap和Hashtable的区别
-
C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)
-
java,hibernate和sqlserver对应的数据类型表
-
Java 哈希函数 哈希表 动态容量 链地址法 简介+实现
-
Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计
-
死磕数据结构与算法——哈希表(java实现)。才疏学浅,如有错误,及时指正
-
Redis字典的哈希表底层实现和哈希节点存储
-
【leetcode】454.四数相加 II (哈希表+数组,开阔思路,java实现!)