欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

List集合粗糙解读

程序员文章站 2022-04-15 14:10:04
...

首先上一张UML图片

List集合粗糙解读

从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方法,其实删除的话判断为不为空就行,不难。到此为止

相关标签: list