散列与Java Map结构分析

       散列是一种常见的数据机构,也就是我们常说的Map,通过key来映射一个value,最终达到保存数据的目的。每个key被映射到0到散列表长度 - 1这个范围中的某个数,并且将key和value放到适当的单元中,这个映射就叫做散列函数(hash function)。理想情况下它应该运算简单并且应该保证任何两个不同的关键字映射到不同的单元,不过这是不可能的。当两个key散列到同一个值的时候(成为冲突),需要通过一定的方法来解决冲突。解决冲突的方式有很多,常见的有分离链表法(HashMap的实现方式)、线性探测法、平方探测法、双散列法等等,具体的原理和实现方法需要读者找数据结构书籍看一看,这也不是能够简单说明白的。
       接下就来分析Java中Map的结构以及大致的特点吧。
散列与Java Map结构分析_第1张图片
       这是来自我在网上看到的一张图,感觉描述得很清晰,直接粘贴过来吧。
       (1)Map是一个接口,定义了很多方法,以散列的形式存储数据。
       (2)AbstractMap是个抽象类,它实现了Map的接口。设计AbstractMap类的意义在于尽可能的实现一些公共方法,这样子类就可以不必实现,调用父类的即可,代码简洁。
       (3)HashMap是最常用的Map结构,是基于链表实现的,它保存的数据是无序的,并且它是非线程安全的。
       (4)WeakHashMap基本与HashMap相同,唯一的区别在于它的key是弱引用,当弱引用被GC时,它对应的value也会被删除。
       (5)SortedMap是个接口,它继承自Map,它定义了一些接口,用于保存数据的排序。
       (6)NavigableMap也是个接口,继承自SortedMap,定义了更多的排序接口。
       (7)TreeMap继承自NavigableMap,因此它保存的数据是有序的,是通过红黑树实现的,非线程安全。
       (8)HashTable继承自Dictionary,并且实现了Map的接口,保存的是无序的键值对,它是线程安全的,并且支持Enumeration遍历。
       以上是对Java Map结构的大致总结。Map在工作中还是经常需要用的,因此搞懂它们是非常有必要的,因为HashMap是最常见、最常用的Map实现,接下来我会写一篇HashMap的详细的源码分析和总结。

你可能感兴趣的:(数据结构)