sjiwang

导航

 

任何一类编程语言,都会提供集合操作,常用的有两种集合,一种是list ,一种是map。java中的集合类图如下

这里面我们重点看下map map中包含hashMap treeMap  以及concurrentHashmap,首先看下hashmap

通常的,有两种数据结构可以存储数据,一种是数组,一种是链表 数组可以随机访问元素,而链表只能顺序访问,不能随机访问,数组存储效率高,存取速度快,但是数组个数不能动态扩充,链表适用于插入和删除频繁,需要动态扩充的情况。在hashmap中,这两种数据结构都会使用到

首先来创建函数

1 public HashMap() {
2         this.loadFactor = DEFAULT_LOAD_FACTOR;
3         threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
4         table = new Entry[DEFAULT_INITIAL_CAPACITY];
5         init();
6     }

首先是存储因子和临界值初始化,值为0.75,以及16*0.75=12,然后创建一个16个元素的数组,init函数为空。

再来看put函数

 1 public V put(K key, V value) {
 2         if (key == null)
 3             return putForNullKey(value);
 4         int hash = hash(key.hashCode());
 5         int i = indexFor(hash, table.length);
 6         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
 7             Object k;
 8             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
 9                 V oldValue = e.value;
10                 e.value = value;
11                 e.recordAccess(this);
12                 return oldValue;
13             }
14         }
15 
16         modCount++;
17         addEntry(hash, key, value, i);
18         return null;
19     }

1、首先判断key是否为null,如果为null,则将value值放入到数组的第0个元素上去

2、对key的hashcode进行hash,h ^ (h >>> 7) ^ (h >>> 4)^(h >>> 20) ^ (h >>> 12),经过这个hash之后,能够最大限度的均匀分布

3、将上面得到的hash值和数组的length进行与操作h & (length-1)

4、得到的肯定是小于数组长度的一个值,然后去数组中看当前位置是否有元素,如果有,并且元素的key和当前key相等,则直接替换,返回

5、如果没有元素,或者有元素,但是key 不相等,则元素数量+1,然后将当前这个key,value值加入到数组的entry中

6、最后进行返回,可以看到,如果key相等,则返回的是原来的value值,如果没有相应的key值,则返回null

 

 

 

posted on 2014-06-25 19:33  sjiwang  阅读(252)  评论(0)    收藏  举报