为速度而散列

来源:互联网 发布:电脑无法上淘宝视频 编辑:程序博客网 时间:2024/05/01 16:09

查找某一个键,你能想到的是使用for循环逐个遍历存储key的集合,然而这是我们能想到的最低效率的方法。当然你也可能想到把key排序,然后使用Collections.binarySearch()二分查找。散列更近一步,数组是查询速度最快的数据结构,但数组是不能调整容量的,这可怎么办呢?答案就是:数组并不保存键本身,而是通过键对象生成一个数字,将其作为数组的下标。这个数字就是散列码,生成散列码的方法就叫做散列函数。
问题来了:这个时候数组容量固定的限制依然没有解决;如果不同的键产生相同的下标这么办?通常是可以固定数组容量然后把数组元素改成list集合来解决冲突问题。如果散列函数比较完美,数组的每个位置都只有较少的值。这便是HashMap会如此快的原因。(注:对于发生冲突后,可能会有另一个散列函数根据键对象的其他内容生成另外的散列码,改散列码决定了键在list中的位置。)

HashMap :基于散列表的实现,取代了Hashtable
LinkHashMap: 类似HashMap,比HashMap慢一点,迭代遍历时取得键值对的顺序是其插入次序,或者是“最近最少使用LRU”的次序
TreeMap:基于红黑树的实现(让你们平时不学数据结构^-^)查找键时,他们会被排序(次序有Comparable或Comparator决定)TreeMap的特点在于所得到的结果是进过排序的,TreeMap是唯一带有subMap方法的Map,它可以返回一个子树

0 0
原创粉丝点击