List集合粗糙解读
程序员文章站
2022-04-15 14:10:04
...
首先上一张UML图片
从uml图片中可以看出ArrayList和AbstractList都属于实现类,不过AbstractList是个抽象类,而ArrayList是个普通的java类,同时ArrayList也继承了AbstractList类,既然ArrayList已经继承的AbstractList,而AbstractList又有实现List接口,那为什么ArrayList还要自己实现List接口呢?多此一举?个人觉得,可能是因为历史原因吧,因为可能先出现AbstractList,再出先List也说不定,后面优化优化着,就变成现在这个版本了,特此说明一下,本人看的是jdk1.8,应该是这样子理解的吧。。。然后AbstractList又继承AbstractCollection接口,List继承Collection接口,AbstractCollection实现Collection接口。接下来我们看一下ArrayList的增删查改(画重点),就算把List集合过一遍了,因为其他方法都是在这些方法上拓展起来的,所以看懂增删查改,其他的都没啥问题了,哈哈。
先来看看ArrayList集合的几个成员变量
注意哦,ArrayList集合是基于数组的
private static final int DEFAULT_CAPACITY = 10;
//Default initial capacity. 扩容量大小为10,添加元素时,数组空间已经满了,就要再在原来的基础上添加10空间
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//上面两个都是空数组,在操作当中借用一下而已
transient Object[] elementData;
//保存数据的数组
private int size;
//elementData数组当中有多少个元素
讲一下trimToSize这个方法
//除掉数组当中为空的元素,例如elementData数组容量大小为10,但是它只存在1个元素,那么他调用这个方法之后,elementData的容量大小就变为1了,节省空间,进而提高查找的效率
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
下面讲个最简单的add方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 添加元素时判断要不要扩容的方法
elementData[size++] = e;//最后赋值
return true;//数组个数超出最大值时,出错,不返回true
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)//判断数组要不要扩容
grow(minCapacity);//扩容的方法
}
//扩容的方法
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);
}
add方法注意扩容就行,其他的方法就不看源码了,懂得了add方法其他的方法自然看得懂,由于时间问题,只能看到add方法,其实删除的话判断为不为空就行,不难。到此为止