为速度而散列

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值