Java(32):哈希表 的原理和应用

来源:互联网 发布:java 多线程 书籍 编辑:程序博客网 时间:2024/06/08 01:13

日期:2017/11/19


     常用的数据结构 Hashtable、hashset、hashmap,它们的共同点:HashXxx:底层数据结构是哈希表。依赖两个方法 hashCode() 和 equals(),根据情况选择是否自动重写。


一、提问

Q:哈希表是什么呢?

A:(1)散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。

         也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
      (2)给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。


Q:哈希表可以保证元素的唯一性?
A:依赖两个方法hashCode()和equals()。


二、应用

SET----HashSet:

       HashSet 堪称查询速度最快的集合,因为其内部是以 HashCode 来实现的。它内部元素的顺序是由哈希码来决定的,所以它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

       ----HashSet----LinkedHashSet:
底层数据结构是哈希表和链表,由哈希表保证元素唯一,由链表保证元素有序。


Map 与 List、Set 接口不同,它是由一系列键值对组成的集合,提供了 key 到 Value 的映射。同时它也没有继承 Collection。在 Map 中它保证了 key 与 value 之间的一一对应关系。也就是说一个 key 对应一个 value,所以它不能存在相同的 key 值,当然 value 值可以相同。


MAP----HashMap

        以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个 hash 表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看 HashMap.Entry 的源码它是一个单链表结构。

       ----Hashtable:

 也是以哈希表数据结构实现的,解决冲突时与 HashMap 也一样也是采用了散列链表的形式,不过性能比 HashMap 要低。


PS:     hashtable 与 hashmap的区别:

          1、历史原因:Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是Java 1.2 引进的 Map 接口的一个实现 。
          2、同步性:Hashtable 是线程安全的,也就是说是同步的,而 HashMap 是线程序不安全的,不是同步的 。
          3、值:只有 HashMap 可以让你将空值作为一个表的条目的 key 或value。






阅读全文
0 0
原创粉丝点击