哈希表的学习
哈希表
散列表
散列(Hashing)通过散列函数(哈希函数)将需要参与检索的数据与散列值(哈希值)关联起来,生成一种便于搜索的数据结构,我们称其为散列表(哈希表)。
散列函数也加哈希函数,哈希函数可以对一个目标计算出其对应的哈希值,并且,只要是同一个目标,无论计算多少次,得到的哈希值都是一样的结果,不同的目标计算出的结果几乎都不同,哈希函数在现实生活中应用十分广泛,比如很多下载网站都提供下载文件的MD5码校验,可以用来判别文件是否完整,哈希函数多种多样,目前应用最为广泛的是SHA-1和MD5。
我们可以利用哈希值的特性,设计一张全新的表结构,这种表结构是专门为哈希设立的,我们称其为哈希表。我们可以将这些元素保存到哈希表中,而保存的位置则与其对应的哈希值有关,哈希值是通过哈希函数计算得到的,我们只需要将对应元素的关键字(一般是整数)提供给哈希函数就可以进行计算了,一般比较简单的哈希函数就是取模操作,哈希表长度是多少(长度最好是一个素数),模就是多少。
保存的数据是无序的,哈希表在查找时只需要进行一次哈希函数计算就能直接找到对应元素的存储位置,效率极高。
package com.test.collection;public class HashTable<E> {private final int TABLE_SIZE=10;private final Node[]TABLE=new Node[TABLE_SIZE];//放入头结点public HashTable(){for (int i = 0; i < TABLE_SIZE; i++)TABLE[i]=new Node<>(null);}//插入public void insert(E obj){int index=hash(obj);Node<E>head=TABLE[index];Node<E>node=new Node<>(obj);node.next=head.next;head.next=node;}//判断是否包含public boolean contains(E element){int index=hash(element);Node<E>node=TABLE[index].next;while (node!=null){if(node.element==element)return true;node=node.next;}return false;}private int hash(E obj){ //哈希函数,计算出存放的位置int hashCode=obj.hashCode();//每一个对象都有一个独一无二的哈希值,可以通过hashCode方法得到(极小概率出现相同情况)return hashCode%TABLE_SIZE;}public String toString(){StringBuilder builder=new StringBuilder();for (int i = 0; i < TABLE_SIZE; i++) {Node<E>head=TABLE[i].next;while (head!=null){builder.append(head.element+"->");head=head.next;}builder.append("\n");}return builder.toString();}private static class Node<E>{private final E element;private Node<E> next;private Node(E element){this.element=element;}}
}