HashMap,LinkHashMap,TreeMap,WeakHashMap,ConcurrentHashMap,IdentityHashMap.
遍历老版本使用枚举(Enumeration) 新版本使用Iterator(
迭代器
)
java集合框架在实现上采用一个个Map.Entry来封装每一个键值对,这样,Map中的元素就变成了Map.Entry的集了,
似乎预示着Map和Set有某种相通性.实际上,在HashSet实现中,HashSet的实现中,
HashSet的元素存储在底层就是借助于HashMap来进行
的(在部分情况下使用了LinkedHashMap).
在java 2集合框架中的Map接口有两个通用实现:HashMap,TreeMap,
LinkedHashMap,
Hashtable。
HashMap是采用哈希表实现
,是Map接口的最好的全面实现.
TreeMap实现了Map的子接口SortedMap,采用红黑树作为底层存储结构,
提供了按照键排序的Map存储,
LinkedHashMap 保持者插入顺序,
Hashtable 与HashMap实现方式一样,但Hashtable属于同步(synchronized)的.
map接口中含有Entry接口(HashMapEntry继承),具有equal ,getkey,getValue,hashcode,setValue. 1.HashMap 允许一个key为空,多个value为空。为单线程安全。不过可以通过
Map synMap = Collections.synchronizedMap (new HashMap(…));,来拿到相对线程安全的hashmap.
求对应数组序列的方法
int
index = hash & (tab.length
– 1
); 然后判断是否重复,否则增大数组,并将key- value放置在
HashMapEntry<K
, V
>里。
HashMap使用了HashCode,用于取代对键的缓慢搜索,Hashcode相对唯一,属于object的方法。
组成原理
HashMap
实际上是一个“链表散列”的数据结构,即数组和链表的结合体。每次new一个HashMap就回new一个数组。
transient Entry[] table;
static class Entry<K,V> implements Map.Entry<K,V> {
V value;
Entry<K,V> next;
final int hash;
2.LinkedHashMap extends HashMap
维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
我们已经知道LinkedHashMap的Entry元素继承HashMap的Entry,提供了双向链表的功能。在上述HashMap的构造器中,最后会调用init()方法,进行相关的初始化,这个方法在HashMap的实现中并无意义,只是提供给子类实现相关的初始化调用。
读取时,
LinkedHashMap重写了父类HashMap的get方法,实际在调用父类getEntry()方法取得查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的元素添加到双向链表的表头,并从原来的位置删除。由于的链表的增加、删除操作是常量级的,故并不会带来性能的损失。
- void recordAccess(HashMap<K,V> m) {
- LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
- // 如果定义了LinkedHashMap的迭代顺序为访问顺序,
- // 则删除以前位置上的元素,并将最新访问的元素添加到链表表头。
- if (lm.accessOrder) {
- lm.modCount++;
- remove();
- addBefore(lm.header);
- }
- }
LinkedHashMap重写了init()方法,在调用父类的构造方法完成构造后,进一步实现了对其元素Entry的初始化操作。
1.按照插入顺序排序。
public
LinkedHashMap(
int
initialCapacity,
float
loadFactor) 按照元素插入顺序返回键值对。 2.按照lru排序
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
3.SortedMap(treeMap为唯一实现)
键处于排序状态,并可以实现Compartor,来针对键值大小生成 map子集。
4.CurrentHashMap
属于线程安全的Hashmap。
引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。
默认是把segments(类似于HashTable,但是不同的是其加读写锁)初始化为长度为16的数组。
5.
IdentityHashMap
它是一个特殊的Map实现,它要求 两个key严格相等时才认为两个key相等(String 内容相同但是对象不同,则认为不同)即判断引用相等,调用k1 == k2,IdentityHashMap有其特殊用途,比如序列化或者深度复制。或者记录对象代理。或者用于记录两个不同的对象。