java 集合源码分析 map篇

    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时,记录访问顺序,将最新访问的元素添加到双向链表的表头,并从原来的位置删除。由于的链表的增加、删除操作是常量级的,故并不会带来性能的损失。

  1. void recordAccess(HashMap<K,V> m) {  
  2.     LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;  
  3.     // 如果定义了LinkedHashMap的迭代顺序为访问顺序,  
  4.     // 则删除以前位置上的元素,并将最新访问的元素添加到链表表头。  
  5.     if (lm.accessOrder) {  
  6.         lm.modCount++;  
  7.         remove();  
  8.         addBefore(lm.header);  
  9.     }  
  10. }  

   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有其特殊用途,比如序列化或者深度复制。或者记录对象代理。或者用于记录两个不同的对象。

    原文作者:java集合源码分析
    原文地址: https://blog.csdn.net/g951dd/article/details/52237314
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞