Java Map 是一种键值对的映射集合,在实际编程过程中,很常见。
具体有以下这些实现类:
HashMap 用到了哈希函数。哈希函数是一种映射关系,根据数据的关键词 key ,通过一定的函数关系,计算出该元素存储位置的函数。
address = H [key]
一种实际的数据结构是拉链式的链表结构:
1 HashTable 与 HashMap
HashTable 的作者是: Arthurvan Hoff、Josh Bloch、Neal Gafter。 而 HashMap 的作者是: Arthurvan Hoff、Josh Bloch、Neal Gafter、Doug Lea。这些人来头不小。
Hashtable 被弃用的原因:
- Hashtable 是线程安全的,效率较低。
- 没有遵循驼峰命名法。
2 WeakHashMap
WeakHashMap 基于弱引用。而 Java 在垃圾回收时,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。
在缓存场景下,由于内存有限,不能缓存所有对象,所以需要一种的删除机制,淘汰掉一些对象 。Tomcat 的源码里,就用到 WeakHashMap 来实现缓存。
注意:如果使用基础类型作为 WeakHashMap 的 key ,那么某些 key 就不会被回收。
输出:
因为基础类型 Integer 会保留 - 128 到 127 的缓存。所以那些Key<= 127 的 Entry 将不会被自动回收,所以 map 的大小会稳定在 128 左右。
但如果我们使用自定义的类作为 key 的话,那么 gc 之后,就会被回收。
输出:
3 IdentityHashMap 与 HaspMap 之间的区别
主要区别是比较方式上,IdentityHashMap 用的是双等号,而 HaspMap 用的是 equals()。
线性探测法指的是,如果 hash 出来的地址已经存在值,那么将线性的方式向下探查,直到找到一个空地址为止。
拉链法之前已做介绍,这里不再赘述。