一 Hash表概念的介绍
Hash表是以键值对是以映射关系的形式将数据存在我们的数据结构中(即哈希表是用来存数据的,并且是一对一对的来存), Hash表(也称散列表)是一种能实现快速插入和查找操作的数据结构,采用根据关键码值(key)来获取对应value的方式(这就是Java中Map的形式)。把关键码值映射到Value的位置的函数称为Hash函数,而存放记录的数组就是哈希表,即Hash表。
Hash表有优点也有缺点。优点:Hash表的查找、插入和删除操作很快,比树快很多,这由于k-v的形式,方便查找。缺点:Hash表是基于数组的,一旦创建很难改变大小,有些哈希表被基本填满时,性能会明显下降;其次,哈希表不方便顺序遍历表中数据。
Hash化是指把待存数据存入哈希表指定位置的过程。即把数据中的关键字转换为对应的数组下标的过程,实现这个过程的函数就是Hash函数(或称散列函数)。过程如图所示,最终可以根据k1对d1进行操作,根据k2对d2进行操作,根据k3对d3进行操作。
过程的重点就在于Hash函数,Hash函数的基本过程如下。1:把关键字转换为唯一的整数,通常这个整数的范围很大。2:把这些整数压缩到(可以接受的)数组的索引范围。常用构造Hash函数的方法有:直接寻址法,数字分析法,平方取中法,折叠法等。然后介绍一下哈希冲突的概念,指的是不同的关键字经过Hash化后得到相同的数组下标。Hash冲突的解决方法有开放地址法和链地址法。开放地址法常用措施为线性探测。
二 Hash应用
HashMap和Hashtable都实现了Map接口,通常创建哈希表对象时使用如下代码: HashMap<K,V> hm= new HashMap<>();这就创建了一个key值数据类型为K、value值数据类型为V的哈希表对象hm。
使用put(K key,V value)向HashMap集合中添加元素,也称为将键值映射存放到HashMap集合中,代码样例为 hm.put("Li",18);
使用get(Object key)返回指定键所映射的值,没有该key对应的值则返回null,代码样例为int age = hm.get("Li");
使用size()返回HashMap集合中的元素数量,代码样例为int sz = hm.size();
使用clear()清空HashMap集合,代码样例为 hm.clear();
使用isEmpty()判断HashMap集合中是否有数据,如果没有则返回true,否则返回false,代码样例boolean result=hm.isEmpty();
使用remove(Object key)语句删除HashMap集合中键为key的数据,并返回其所对应的value值,样例代码为int age = hm.remove("Li");
使用values()返回HashMap集合中所有value组成的数据,且数据类型为Collection<value>,样例代码为Collection<value> con = hm.values();