可以分为单列集合和双列集合
单列集合主要有Collection下面的List与Set,其中List最长被用到的是ArrayList与linkedList以及Vctor三种 Set最常用的是我们的HashSet以及TreeSet linkedHashSet可以使Set有序(插入与输出)
Collection都可以使用迭代器进行迭代
UML 类图如下
双列集合Map是基类
Map集合下常用的有HashMap与ConcurrentHashMap 、TreeMap、以及linkedHashMap(保证插入的顺序与输出的顺序一致)
类图如下
ArrayList的源码解析1、无参构造方法第一次构建创建的数组使{} 没有值 长度是0
list第一次添加元素,不管什么时候添加元素都会查看是需要进行扩容
计算所需要的容量第一次默认是数组大小是10
grow()是进行扩容的方法除了第一次默认是10 以后每一次都是扩容1.5倍
如果使用有参构造方法的话每次以后每次扩容1.5倍 不演示调试截图了
代码整理
// 存储数据的集合
transient Object[] elementData; // non-private to simplify nested class access
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// list集合的add方法
public boolean add(E e) {
// size 默认是0 第一次添加传入的参数就是 0+1
ensureCapacityInternal(size + 1); // Increments modCount!!
// 确保内部容量没有问题以后 就进行复制操作
elementData[size++] = e;
return true;
}
// 确保内部的容量可用
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 计算容量的方法
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// 进入这里说明集合就是初始值 所以看需要的容量的最小值与 默认容量之间那个大 就返回默认容量
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
// 如果前面没有返回说明了 数组已经进行了初始化 就返回现在需要的容量大小
return minCapacity;
}
// 确保容量
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code 如果容量不够就进行扩容 最小的容量都比数组的长度大了 那肯定就是要进行扩容了
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
// 扩容方法
private void grow(int minCapacity) {
// overflow-conscious code
// 先取出原来的数组容量 第一次取就是0
int oldCapacity = elementData.length;
// 新的数组长度计算 就是 old + old / 2 原来的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果new 计算出来的容量不如要求最小的容量 就把new 容量 重新复制成 min
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);
}



