Vector集合最全面的源码分析

二,   单点突破

2.1,构造函数

2.1.1 ,初始容量为10

public Vector() {
        this(10);//初始容量为10
}

2.1.2,看下初始容量是怎么分配的?

(1) 第一步,调用了这个方法
public Vector(int initialCapacity) {
        this(initialCapacity, 0);
}(2)第二步调用下面的这个方法
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)//首先先检查初始容量是否小于0,若小于0,则抛出异常提示,因为数组空间大小分配不能小于0呀
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];//创建一个容量大小为initialCapacity的数组,赋值给成员变量elementData
    this.capacityIncrement = capacityIncrement;//这里的capacityIncrement大小为0
}

2.2,add() 方法

public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);//首先检查集合里是否还有剩余空间盛下元素e,若没有,则需要进行扩容操作
    elementData[elementCount++] = e;//将元素e添加到集合的最后一个位置,elementCount值增加1
    return true;//默认添加元素成功
}

2.3,size()方法

public synchronized int size() {
    return elementCount;//elementCount是个成员变量,用作记录集合元素大小的变量,调用size()方法时就是统计这个值的大小
}

2.4,isEmpty()方法

public synchronized boolean isEmpty() {
    return elementCount == 0;//判断集合是否为空时,就是判断elementCount是否等于零
}

2.5,get()方法

public synchronized E get(int index) {//这个方法就是索引下标获取集合对应的元素
    if (index >= elementCount)//首先我们要检查一下index是否大于集合的elementCount大小,因为大于了,说明越界了嘛
        throw new ArrayIndexOutOfBoundsException(index);

    return elementData(index);
}
(2)//调用elementData()方法
E elementData(int index) {
    return (E) elementData[index];//根据数组的特点,通过索引下标找到指定索引位置的元素
}

2.6,clear()方法

public void clear() {
    removeAllElements();//这是第一步操作
}

public synchronized void removeAllElements() {
    modCount++;
    // Let gc do its work
    for (int i = 0; i < elementCount; i++){
        //循环遍历整个集合,将集合中的每个元素置为null,这样java虚拟机就会在某个时间点触发垃圾回收机制(gc)进行回收
        elementData[i] = null;
    }

    elementCount = 0;//最后将代表集合元素大小的成员变量elementCount的值置为零
}

2.7,contains()方法

public boolean contains(Object o) {//判断集合里面是否包含元素的方法也是很常用的
    return indexOf(o, 0) >= 0;
}

public synchronized int indexOf(Object o, int index) {
    if (o == null) {//因为集合里面的元素可能为null,这里就分两种情况进行处理了,首先先判断元素o是否为null
        for (int i = index ; i < elementCount ; i++)//循环遍历集合,对每个元素进行判断,时间复杂度为O(n)
            if (elementData[i]==null)
                return i;//返回元素o在集合(即数组)的索引下标位置
    } else {
        for (int i = index ; i < elementCount ; i++)
            //这里也是对集合的每个元素进行判断,这里的o不会为null,所以可以直接o.equals()调用
            //,如果o为null,这里调用就会出现空指针异常了,切记这一点
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;//若两种情况都分析完了,还是找不到,就直接返回-1,indexOf(o,0)>=0若返回-1,说明集合不包含元素o呗
}

2.8,remove()方法

public boolean remove(Object o) {    return removeElement(o);
}
(2) 第二步操作
public synchronized boolean removeElement(Object obj) {
    modCount++;
    int i = indexOf(obj);//首先通过indexof()找到元素obj在集合元素中的下标位置,若找不到则表示待删除的元素obj不存在呗
    if (i >= 0) {
        removeElementAt(i);//删除指定位置的元素
        return true;
    }
    return false;//表示元素obj不在集合中
}
(3)第三步操作
public synchronized void removeElementAt(int index) {
    modCount++;
    if (index >= elementCount) {
        //首先也要判断索引下标是否大于等于集合元素个数,因为索引下标是从0开始的,所以最大下标为size()-1
        throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                 elementCount);
    }
    else if (index < 0) {
        //若index小于0,此时也不符合,就会出现索引越界的情况,此时抛出索引越界的异常就可以了,
        //由程序的调用者自己去避免这种问题
        throw new ArrayIndexOutOfBoundsException(index);
    }
    //如果数组元素被删除后,集合里面的元素就要移动
    int j = elementCount - index - 1;
    if (j > 0) {
        System.arraycopy(elementData, index + 1, elementData, index, j);
    }
    //集合元素个数减一
    elementCount--;
    elementData[elementCount] = null; /* to let gc do its work */   //此时已经标明这里要触发gc机制了
}

2.8,capacity()方法

public synchronized int size() {
    return elementCount;//返回集合容量大小,而不是集合元素个数
}

2.9,firstElement()方法

public synchronized E firstElement() {
    if (elementCount == 0) {//首先判断集合元素个数是否大于0,等于0表示集合里没有元素嘛
        throw new NoSuchElementException();//直接抛出对应的异常
    }
    return elementData(0);//根据数组的特点,根据索引下标位置获取对应元素
}

2.10,lastElement()

public synchronized E lastElement() {
    if (elementCount == 0) {//首先判断集合元素个数是否大于0,等于0表示集合里没有元素嘛
        throw new NoSuchElementException();
    }
    return elementData(elementCount - 1);//根据数组的特点,根据索引下标位置获取对应元素
}

2.11,elementAt()方法

public synchronized E elementAt(int index) {
    if (index >= elementCount) {//预检查机制
        throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
    }

    return elementData(index);//根据数组的索引下标获取集合里指定位置的元素
}

三,总结一下

3.1,方法总结

对于每个方法,去理解具体的实现原理,学会如何分析一个方法,这样可以帮你更加去编写可读性高,具备可扩展的代码有所帮助,其实,现在我写内容也帮助了自己很多,如果帮助到需要的你,那就再好不过了,喜欢的帮忙转发一下(感谢)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值