-
- **List集合**
-
- ArrayList
-
Vector
-
LinkedList
-
Set集合
-
- HashSet
-
LinkedHashSet
-
**Map集合**
-
- Map 接口的遍历方式
-
HashMap
-
Hashtable
-
Properties
-
TreeSet
-
TreeMap
-
开发中如何选择集合实现类
-
Iterator遍历
-
Collection工具类
-
集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
-
List集合中的每个元素都有其对应的顺序索引,即支持索引索引是从0开始的
ArrayList
ArrayList是由数组来实现数据存储的
ArrayList 基本等同于Vector,除了ArrayList是线程不安全的(执行效率高),在多线程的情况不建议使用ArrayList
源码分析结论:
-
ArrayList中底层一直维护一个Object类型的数组 elementData(transient Object[] elementData 表示瞬间,短暂的,表示该属性不会被序列化)
-
ArrayList如果使用无参构造,则初始elementData 容量为0,第一次扩容容量为10,如需要再次扩容,则扩容为原来的1.5倍,即 newCapacity = oldCapacity + oldCapacity>>1
-
如果使用的是有参构造,则初始elementData容量为指定大小,如果需要扩容,则扩容为原来的1.5倍
//源代码是jdk1.8版本
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;//无参构造下初始值为0,如果是有参构造,值为指定的值
int newCapacity = oldCapacity + (oldCapacity >> 1);//>>表示右移一位 相当于除以2
if (newCapacity - minCapacity < 0) //此处无参构造下第一次扩容,newCapacity为0,而minCapacity为10,故做一下处理
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); //使用Copyof的话,使得在原先的数组值不变的情况下进行扩容
}
Vector
Vector 底层也是一个对象数组,protect Object [] element Data;
Vector 是线程同步的,即线程安全,Vector类的操作方式带有Synchronied
在开发中,如果需要线程同步安全,则应该考虑Vector
源码分析结论:
-
Vector 如果使用无参构造的,默认容量为10,如需要再次扩容,就按2倍扩容
-
如果使用有参构造,或有参时只指定初始容量,未指定需要增加的容量,则初始容量为指定的容量,如需再次扩容,则扩容后的容量为原来的两倍
-
如果使用有参构造,构造时既指定初始容量,又指定需要增加的容量,则初始容量为指定的容量,如需再次扩容,则扩容后的容量为原来的加上增加容量,详细如下