集合-List与Set
List 集合
List 是一个接口 他继承与Collection的接口;有序可重复的集合
实现List 的对象有 ArrayList 、LinkedList 和 Vector
ArrayList
ArrayList 底层是用数组实现的,有下标 查询快增删慢,在每次进行增删操作时都会移动元素;线程异步,非线程安全的集合。
底层操作:在new ArrayList() 的时候 源码中是 将 elementData 属性赋值一个长度为0的一个数组{} 在add 操作的时候进行扩容 首次扩容长度为 10的一个集合,在之后add过程总
add()->ensureCapacityInternal()->ensureExplicitCapacity()> grow()
所以 扩容的操作是在 grow()方法中 当当前长度+1 > 数组长度时触发这个方法, Array.copy 将数据copy到一个1.5倍的数组中
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
LinkedList
LinkedList 底层是双向链表,对增删操作快,查询操作慢;LinkedList 每次进行增删操作都不需要进行移动元素,只需要更改节点指针即可; 可作为堆栈,对了列 双向队列使用。
Vector
Vector底层是动态数组实现的与ArraList是一样的 只不过Vector是线程同步的,线程安全的;由于Vector使用了synchronized修饰方法 所有效率是低于ArrayList的。
Set 集合 -(无序不重复的集合)
Set 也是一个接口 他继承了Collection接口,是无序不重复的集合;
实现Set 的类有 HashSet、LinkedHashSet、TreeSet
HashSet
HashSet 底层是HashMap实现的也可以说底层是hash表实现的 无序不重复的可以为存null,非线程安全的; HashSet判断两个对象是否相同是通过hashCode()方法与equals()方法来判断的
LinkedHashSet
LinkedHashSet 通过继承HashSet,底层使用LinkedHashMap, 底层是由一个Hash表与双链表实现的 双链表是用来记录数据插入的顺序的; 有序不重复的集合
TreeSet
TreeSet底层是基于TreeMap的,将加入的元素作为TreeMap的key,使用一个常量类来作为公共的value; 通过比较器或者自然排序来对元素进行排序的, 元素不重复的集合, 默认不可存入null,可自定义比较器来实现null的存储;
List 与Set 的区别
\List 是有序可重复的集合,Set 是无序不重复的集合