标签:remove 产生 span 设置 负载 组元 style length move
1、ArrayList和LinkedList的区别
ArrayList底层实现是数组,在内存是是一片连续的空间;LinkedList底层实现是链表,在内存中不是连续的空间。
2、HashMap的实现,负载因子是多少
HashMap底层是一个数组,数组中的每一项是一个链表(Entry),Entry中包含key,value和一个指向next Entry的指针。
HashMap中允许存放NULL key和NULL value,NULL key的键值对存放在数组下标为0的链表中。
put操作:
每次添加元素(put)的时候,先计算出key的hash,根据hash找到key在数组中的索引,如果对应索引的链表的节点key的hash值与要放置元素的key的hash值相同,并且它们key的equals方法返回true,就用待放置的元素的vlaue替换链表对应节点的value;如果不存在,在数组对应的索引下创建一个链表节点,将key,value,hash放入节点,并将next指针指向此链表的头结点(即采用头插法)。 在添加元素时,如果发现HaspMap的容量达到临界值(threshold,值为容量*负载因子)并且要放置的位置不为空时,将HashMap的容量扩至两倍(默认初试容量为16,负载因子为0.75),并重新计算hash和要放置的位置(原来的数据都要重新计算放置的位置并重新放入,这是个非常耗时的操作,如果知道要放置元素的个数,在初始化的时候就指定容量,可以避免扩容操作)。hashmap的容量设置为2^n,在根据hash计算key在数组中的索引的时候可以减少hash冲突,计算hash在数组中索引的方法为h & (length-1),由于length为2^n,length-1相当于把最高位1变成0,剩下位0变成1,在和hash做&运算,相当hash对length取模,即hash%length,由于低位全是1,所以计算之后得到的索引低位与hash低位相同,这样就减少了得到相同索引的几率,减少处理冲突的次数,查找元素时,也减少了遍历数组元素链表的几率,提高查找效率。
get操作:
查找元素时,根据key计算出hash,再根据hash找到key在数组中的索引,遍历对应索引下的链表,如果链表中节点的hash和待查找key的hash相等,且它们key的equals方法返回true,则返回节点的value,如果未查找到,返回null。
remove操作:
删除元素时,根据key计算出hash,再根据hash找到key在数组中的索引,遍历对应索引下的链表,如果链表中节点的hash和待查找key的hash相等,且它们key的equals方法返回true,则删除节点,并返回被删除元素的value。
3、fail-fast机制
fail-fast 机制是 java 集合(Collection)中的一种错误机制。 当多个线程对同一个集合的内容进行操作时,或者使用for循环迭集合的同时增加或删除集合中的元素,就可能会产生 fail-fast 事件,抛出 ConcurrentModificationException。(通过迭代器进行remove元素不会抛出异常)
3、ConcurrentHashMap的实现
集合框架
标签:remove 产生 span 设置 负载 组元 style length move
原文地址:http://www.cnblogs.com/lolau/p/7144997.html