先看段代码:
Scanner input = new Scanner(System.in);
Map map = new HashMap(); //定义Map对象
map.put("apple", "新鲜的苹果"); //向集合中添加对象
map.put("computer", "配置优良的计算机");
map.put("book", "堆积成山的图书");
map.put("time", new Date());
//自定义输入key和value
System.out.println("请输入key:");
String key = input.next();
System.out.println("请输入value:");
String value = input.next();
//存入哈希
map.put(key, value);
//获取哈希表中的key集合
Set keySet = map.keySet();
System.out.println("表中现有key:"+keySet);
//查询想查的key值
System.out.print("请输入你要查询的key:");
key = input.next();
//判断是否包含指定的键值
boolean contains = map.containsKey(key);
if (contains) {//如果条件为真
System.out.println("__________键名" + key+"_________");
System.out.println("信息为:" + map.getOrDefault(key, value));
} else {
System.out.println("__________在Map集合中不包含键名" + key+"_________");
}
因为题目:https://blog.csdn.net/floris_lovelace/article/details/80849477
哈希表以空间换速度,所以就开始看哈希表怎么玩,哈希表到底是什么东西。
哈希表是什么:
哈希表是一种与数组、链表等不同的数据结构,与他们需要不断的遍历比较来查找的办法不同。
(当我知道key值以后,我就可以直接计算出这个元素在集合中的位置,根本不需要一次又一次的查找!)
哈希表设计了一个映射关系f(key)= address,根据key来计算存储地址address,这样可以1次查找,f既是存储数据过程中用来指引数据存储到什么位置的函数,也是将来查找这个位置的算法,叫做哈希算法。
简单来说就是:记录的存储位置=f(关键字)
哈希函数的作用:
是提供的 key转化数组下标 的关键。
数组下标所对应的 空间存储着value。
哈希函数把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余。
常用哈希函数:
元素特征转变为数组下标的方法就是散列法。散列法当然不止一种,下面列出我理解的两种:
(其实还有一种斐波那契(Fibonacci)散列法,但是脑袋疼,就先不看了,想要了解的可以看文末参考链接。)
1. 除法散列法
最直观的一种,上图使用的就是这种散列法,公式:
index = value % 16
学过汇编的都知道,求模数其实是通过一个除法运算得到的,所以叫“除法散列法”。
2. 平方散列法
求index是非常频繁的操作,而乘法的运算要比除法来得省时(对现在的CPU来说,估计我们感觉不出来),所以我们考虑把除法换成乘法和一个位移操作。公式:
index = (value * value) >> 28 (右移,除以2^28。记法:左移变大,是乘。右移变小,是除。)
如果数值分配比较均匀的话这种方法能得到不错的结果,但有时候算出来的index都是相同的——非常失败。此外,value如果很大,value * value不会溢出吗?答案是会的,但我们这个乘法不关心溢出,因为我们根本不是为了获取相乘结果,而是为了获取index。
哈希冲突:
通过哈希函数去计算哈希值,难免会有冲突的时候,解决冲突的方法有如下几种:
开放定址法:依靠数组中的空位解决碰撞冲突
线性探测法:直接检测散列表的下一个位置(即索引值加1),如果仍冲突,继续;
二次探测法:即H + 1^2, H + 2^2, H + 3^2…
伪随机探测
再哈希法:使用多个哈希函数,第一个冲突时,使用第二个哈希函数,知道不冲突为止;
链地址法:将所有哈希地址相同的关键字,都链接到同一个链表中;
最后最后下一次要写hash表的常用操作~
参考资料:
1.关于map.containsKey方法:https://www.cnblogs.com/wangjubi/p/5740434.html
2.关于哈希表:http://www.yixieshi.com/95421.html
3.哈希函数:http://www.cnblogs.com/nafio/p/9221529.html
好累啊啊啊啊,但是还是要加油!学会去归纳出自己的东西来!