List 与Set接口
Collection 接口存储一组不唯一、无序的对象
List接口存储一组不唯一、有序(插入顺序)的对象
Set接口存储一组唯一、无序的对象
Map接口存储一组键值对象,提供key到value的映射
set接口中的实现类
HashSet:采用Hashtable哈希表存储结构
优点:添加速度快,查询速度快,删除速度快
缺点:无序
TreeSet
采用二叉树(红黑树)的存储结构
优点:有序(排序后的升序)查询速度比List快
缺点:查询速度没有HashSet快
java 容器 collection 和map的区别。collection中存储了一组对象,而map存储的是key、value,并且key不能重复。
Map:
HashMap:非线程安全、无序、key不重复。
TreeMap:非线程安全、有序、key不重复。
Hashtable:线程安全、无序、不重复。
ConcurrentHashMap:线程安全,有序、不重复。
Collection
set: 有序、不重复对象
TreeSet:非线程安全、有序、不重复。
HashSet:非线程安全、有序、不重复。
List: 按插入顺序、对象可重复
TreeList:非线程安全、按插入顺序、可重复。
ArrayList:非线程安全、插入顺序、可重复。
LinkedList:非线程安全、插入顺序、可重复。
Vector:线程安全、插入顺序、可重复。
Arraylist : 初始大小为10,原大小+ 原大小右移1位 = 1.5 扩容。oldCapacity + (oldCapacity >> 1)。插入删除时都会copy一份。
Vector: 直接2倍扩容。oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity)
HashMap: 初始16 ,2倍(2的n次幂)扩容.左移1位.newCap = oldCap << 1
为什么hashmap容量是2的n次幂?
1.方便进行 与 运算 (HashMap: 376行),与运算比取模运算效率高
2.在扩容之后涉及到元素的迁移过程,迁移的时候只需要判断二进制的前一位是0或者1即可。
如果是0,表示新数组和旧数组的下标位置不变,如果是1,只需要将索引位置加上旧的数组的长度值即为新数组的下标
ArrayList 源码分析
add(Object o )
/**
* 将当前数组大小+1传入 ensureCapacityInternal方法
* 将e 对象添加到 elementData 数组的 当前数组+1位置。数据的最后一位,非数组的末尾!!!
* 并且每次添加对象,数组的大小都会1.5倍扩张
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 当前数组大小 + 1
elementData[size++] = e;
return true;
}
/**
* 判断下 elementData 是否是空的,空的就取最小值10
* 如果当前数组&