对hash表的浅见

1.数组
java数组存放的也是引用
比如String[] test ,那么test[i]实际就是指向第i个元素的一个引用。
数组表示一段连续范围的内存区域,

2.ArrayList
ArrayList本质也是数组,存放的也是引用,T表示数组的引用类型是什么,指向什么类型的对象。
添加:为了让数组空间连续使用,ArrayList最关键的是使用了一个size变量,保存List的大小,然后如果要插入的话,那么数据就会插入到数组的[size-1]的位置
删除:删除的话,ArrayList只能按照下标删除。所以删除元素必须使用for(int i;i<list.size();i++)方式遍历list,使用下标i来删除,而不能用for-each遍历。
查找:只能通过遍历。

3.HashMap<K,V>
HashMap本质也是数组,不过他的数组对象类型是固定的,存放的是Entry,不过Entry里面的Key和Value的类型是K,V泛型定义的。
添加:map.put(“key”,“value”);
删除:map.remove(“key”);
查找:map.get(“key”);
这里先说一下哈希(hash)表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方
哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。
可以看到,hashtable按照标准定义,他的元素本来就是key-value的形式的。也就是java里面的entry,
HashTable就是真真正正教科书意义上的哈希表,HashSet才不是哈希表,那是阉割版,value为null.
key是作为hash函数的输入确定存放位置,value我们希望的存放值。
最典型的的例子就是字典,大家估计小学的时候也用过不少新华字典吧,如果我想要获取“按”字详细信息,我肯定会去根据拼音an去查找 拼音索引(当然也可以是偏旁索引),我们首先去查an在字典的位置,查了一下得到“安”,结果如下。这过程就是键码映射,在公式里面,就是通过key去查找f(key)。其中,按就是关键字(key),f()就是字典索引,也就是哈希函数,查到的页码4就是哈希值。

另外还可以按照实物理解,那就是英语词典,英语词典的外侧是不是有条纹?

这里就是hash表的思想
1.key是页码,你看到这个条纹,就会翻到对应的页码。比如你要查找A开头的字母,翻到第一页,那么key就是"A",value就是"1"
2.value是存放在书本里面的英文单词,有Apple,About,那么这两个单词就是哈希冲突,用拉链法可以解决。

猜你喜欢

转载自blog.csdn.net/huangning1995/article/details/86098358
今日推荐