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有其特殊用途,比如序列化或者深度复制。或者记录对象代理。或者用于记录两个不同的对象。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值