任何一类编程语言,都会提供集合操作,常用的有两种集合,一种是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
浙公网安备 33010602011771号