须要注意的是:Hashmap 不是同步的,若是多个线程同时访问一个 HashMap,而其中至少一个线程从结构上(指添加或者删除一个或多个映
射关系的任何操做)修改了,则必须保持外部同步,以防止对映射进行意外的非同步访问html
当咱们 put 的时候,若是 key 存在了,那么新的 value 会代替旧的 value,而且若是 key 存在的状况下,该方法返回的是旧的 value,
若是 key 不存在,那么返回 nulljava
当咱们往 HashMap 中 put 元素的时候,先根据 key 的 hashCode 从新计算 hash 值,根据 hash 值获得这个元素在数组中的位置(即下标
),若是数组该位置上已经存放有其余元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最早加入的放在链尾。若是数组
该位置上没有元素,就直接将该元素放到此数组中的该位置上算法
从 HashMap 中 get 元素时,首先计算 key 的 hashCode,找到数组中对应位置的某一元素,而后经过 key 的 equals 方法在对应位置的链
表中找到须要的元素数组
简单地说,HashMap 在底层将 key-value 当成一个总体进行处理,这个总体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来
保存全部的 key-value 对,当须要存储一个 Entry 对象时,会根据 hash 算法来决定其在数组中的存储位置,在根据 equals 方法决定其在该数组
位置上的链表中的存储位置;当须要取出一个Entry 时,也会根据 hash 算法找到其在数组中的存储位置,再根据 equals 方法从该位置上的链表中
取出该Entryspa
Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); }
这种遍历方式效率低线程
Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { Object key = iter.next(); Object val = map.get(key); }