06_哈希表

 1.哈希表的概念


 2.散列函数的概念


 3.哈希表的内存图


 4.哈希表的Java实现(数组+链表)

package DataStructureReview;

import java.util.ArrayList;
import java.util.LinkedList;

public class HashTableDemo {
    public static void main(String[] args) {
        //创建hashtable
        HashTable hashTable = new HashTable();
        //添加数据
        hashTable.add(new Emp(1, "x"));
        hashTable.add(new Emp(2, "y"));
        hashTable.add(new Emp(3, "z"));
        hashTable.add(new Emp(4, "a"));
        //遍历
        System.out.println(hashTable.toString());
        //根据id查询元素
        System.out.println(hashTable.findEmpById(2));
        //根据id删除元素
        System.out.println(hashTable.delete(2));
        System.out.println(hashTable);


    }
}

class HashTable {
    private ArrayList<LinkedList> linkedlistarr = new ArrayList();
    //设置哈希表链表条数
    private int size = 10;

    //为链表数组初始化
    public HashTable() {
        for (int i = 0; i < size; i++) {
            linkedlistarr.add(i, new LinkedList<Emp>());
        }
    }

    //添加数据
    public void add(Emp emp) {
        //根据散列函数确定数据存放在第几条链表上
        linkedlistarr.get(hashFun(emp.id)).add(emp);
    }

    //删除数据,根据员工id删除
    public boolean delete(int id) {
        //获取数据存放的链表
        LinkedList linkedList = linkedlistarr.get(hashFun(id));
        //判断编号为id的员工是否存在
        boolean flag = false;
        Emp emp = null;
        for (Object obj : linkedList) {
            emp = (Emp) obj;
            if (emp.id == id) {
                flag = true;
                break;
            }
        }
        //删除元素
        if (flag == true) {
            linkedList.remove(emp);
        }
        return flag;
    }

    //根据id查询数据记录
    public Emp findEmpById(int id) {
        //获取数据存放的链表
        LinkedList linkedList = linkedlistarr.get(hashFun(id));
        //判断编号为id的员工是否存在
        boolean flag = false;
        Emp emp = null;
        for (Object obj : linkedList) {
            emp = (Emp) obj;
            if (emp.id == id) {
                flag = true;
                break;
            }
        }
        return flag ? emp : null;
    }

    //遍历hashtable
    @Override
    public String toString() {
        for (int i = 0; i < size; i++) {

            if (linkedlistarr.get(i).isEmpty() != true) {
                for (Object obj : linkedlistarr.get(i)) {
                    System.out.println((Emp) obj);
                }
            }

        }

        return "";
    }

    //散列函数(哈希函数),给定key value 返回存储在那条链表上
    public int hashFun(int id) {
        //除留余数法
        return id % size;
    }


}

class Emp {
    public int id;
    private String name;

    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

猜你喜欢

转载自www.cnblogs.com/bajiaotai/p/12918699.html
今日推荐