ArrayList 和 LinkedList:
ArrayList 底层是数组,LinkedList底层是一个双向链表,所以:
查找元素ArrayList比较快
插入,增加,删除则是LinkedList比较快
LinkedList比ArrayList更加占用内存,因为LinkedList每个节点要存储前后两个节点的引用。
Hashtable 和 Hashmap 和 ConCurrentpHashmap:
Hashmap 底层是数组加链表,在jdk1.8后,如果链表长度大于或等于8则会转化为红黑树
即首先先是一个数组,数组内存着一个个链表,当数据添加的时候,先根据key的hashcode算出在数组的哪个下标上,即在哪个链表上,然后如果链表没有元素则直接添加,否则添加在链表头部,成为链表第一个元素。
Hashtable 线程安全的,全锁(同一把锁),不允许null,key和value都不行,较旧的集合,不推荐使用
ConCurrentpHashmap 线程安全的,分段锁,即有数据操作时,只对一部分数据上锁,提高操作效率
Hashmap 非线程安全的,允许null,key和value都可以
HashSet:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
...
HashSet底层其实是一个Hashmap,Hashmap存的是一个对象,HashSet在Hashmap上添加了一步检验,HashSet将添加的对象当成key,然后调用Hashmap的put,
1,如果hash码值不相同,说明是一个新元素,存;;
2(1),如果hash码值相同,且equles判断相等,说明元素已经存在,不存;
2(2),如果hash码值相同,且equles判断不相等,说明元素不存在,存;