美文网首页IT技术篇
Java容器类源码-Vector的最全的源码分析(三)

Java容器类源码-Vector的最全的源码分析(三)

作者: 游戏原画设计 | 来源:发表于2019-01-10 14:32 被阅读0次

    (16) public synchronized void removeElementAt(int index)

    源码解释:

    获取到index位置后有多少个元素,并将index位置后面的元素复制到index位置前的后面,再将index位置置空。复制操作通过JNI实现。

    public synchronized void removeElementAt(int index) {

    modCount++;

    if (index >= elementCount) {

    throw new ArrayIndexOutOfBoundsException(index + " >= " +

    elementCount);

    }

    else if (index < 0) {

    throw new ArrayIndexOutOfBoundsException(index);

    }

    int j = elementCount - index - 1;// 获取第index位置后有多少个元素

    if (j > 0) {

    System.arraycopy(elementData, index + 1, elementData, index, j);// 将emlementData[j, elementCount]复制到elementData[0, index]的后面

    }

    elementCount--;

    elementData[elementCount] = null; // 等待GC

    }

    (17) public synchronized void insertElementAt(E obj, int index)

    源码解释:

    将index位置后的元素复制到原数组的index+1位置后的地方,并在index位置赋值obj。

    public synchronized void insertElementAt(E obj, int index) {

    modCount++;

    if (index > elementCount) {

    throw new ArrayIndexOutOfBoundsException(index

    + " > " + elementCount);

    }

    ensureCapacityHelper(elementCount + 1);// 判断是否需要扩容

    System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);// 将elementData[index+1, elementCount]复制到elementData[index+1, elementCount +1]位置,

    elementData[index] = obj;// 在index位置赋值obj

    elementCount++;

    }

    (18) public synchronized void addElement(E obj)

    源码解释:

    在数组最后添加数据obj。先扩容,再通过数组赋值。

    public synchronized void addElement(E obj) {

    modCount++;

    ensureCapacityHelper(elementCount + 1);

    elementData[elementCount++] = obj;

    }

    (19) public synchronized boolean removeElement(Object obj)

    源码解释:

    移除元素。先获取到移除元素在数组的位置,然后调用removeElementAt方法移除元素。

    public synchronized boolean removeElement(Object obj) {

    modCount++;

    int i = indexOf(obj);

    if (i >= 0) {

    removeElementAt(i);

    return true;

    }

    return false;

    }

    (20) public synchronized void removeAllElements()

    源码解释:

    移除所有元素。即将所有元素置为null,等待gc。

    public synchronized void removeAllElements() {

    modCount++;

    // Let gc do its work

    for (int i = 0; i < elementCount; i++)

    elementData[i] = null;

    elementCount = 0;

    }

    (21) public synchronized E get(int index)

    源码解释:

    获取index位置的元素。

    public synchronized E get(int index) {

    if (index >= elementCount)

    throw new ArrayIndexOutOfBoundsException(index);

    return elementData(index);

    }

    (22) public synchronized E set(int index, E element)

    源码解释:

    修改index位置的值为element。实现原理也是直接数组赋值。

    public synchronized E set(int index, E element) {

    if (index >= elementCount)

    throw new ArrayIndexOutOfBoundsException(index);

    E oldValue = elementData(index);

    elementData[index] = element;

    return oldValue;

    }

    (23) public synchronized boolean add(E e)

    源码解释:

    在最后位置新增元素e。先判断是否需要扩容,然后赋值。实现原理和addElement是一样的。

    public synchronized boolean add(E e) {

    modCount++;

    ensureCapacityHelper(elementCount + 1);

    elementData[elementCount++] = e;

    return true;

    }

    (24) public boolean remove(Object o)

    源码解释:

    移除元素,和removeElement方法一样。

    public boolean remove(Object o) {

    return removeElement(o);

    }

    (25) public void add(int index, E element)

    源码解释:

    添加元素,和insertElementAt方法一样。

    public void add(int index, E element) {

    insertElementAt(element, index);

    }

    (26) public synchronized E remove(int index)

    源码解释:

    移除index位置的元素。实现思路和removeElementAt类似。

    public synchronized E remove(int index) {

    modCount++;

    if (index >= elementCount)

    throw new ArrayIndexOutOfBoundsException(index);

    E oldValue = elementData(index);// 获取到旧值

    int numMoved = elementCount - index - 1;// index位置后面元素的个数

    if (numMoved > 0)

    System.arraycopy(elementData, index+1, elementData, index, numMoved);// 将elementData[index+1, elementCount]移到element[0, index]后

    elementData[--elementCount] = null; // Let gc do its work

    return oldValue;

    }

    (27) public void clear()

    源码解释:

    移除所有元素,直接调用removeAllElements()。

    public void clear() {

    removeAllElements();

    }

    (28) public synchronized boolean containsAll(Collection<?> c)

    源码解释:

    判断是否包含集合c的所有元素。调用AbstractCollection的实现,代码也很简单,不赘叙。

    public synchronized boolean containsAll(Collection c) {

    return super.containsAll(c);

    }

    public boolean containsAll(Collection c) {

    for (Object e : c)

    if (!contains(e))

    return false;

    return true;

    }

    (29) public synchronized boolean addAll(Collection<? extends E> c)

    源码解释:

    把集合c复制到当前数组的末尾。先判断是否需要扩容,然后调用JNI的arraycopy实现复制。

    public synchronized boolean addAll(Collection c) {

    modCount++;

    Object[] a = c.toArray();

    int numNew = a.length;

    ensureCapacityHelper(elementCount + numNew);

    System.arraycopy(a, 0, elementData, elementCount, numNew);

    elementCount += numNew;

    return numNew != 0;

    }

    (30) public synchronized boolean removeAll(Collection<?> c)

    源码解释:

    将包含集合c的所有元素移除。调用AbstractCollection的实现,代码也很简单,不赘叙。

    public boolean removeAll(Collection c) {

    Objects.requireNonNull(c);

    boolean modified = false;

    Iterator it = iterator();

    while (it.hasNext()) {

    if (c.contains(it.next())) {

    it.remove();

    modified = true;

    }

    }

    return modified;

    }

    每天都在分享文章,也每天都有人想要我出来给大家分享下怎么去学习Java。大家都知道,我们是学Java全栈的,大家就肯定以为我有全套的Java系统教程。没错,我是有Java全套系统教程,进扣裙【47】974【9726】所示,进群的时候记得表明自己想要学习什么,不要用小号,这样小编才好给你们发定向资源,今天小编就免费送!~

    “我们相信人人都可以成为一个程序员,现在开始,找个师兄,带你入门,学习的路上不再迷茫。这里是ja+va修真院,初学者转行到互联网行业的聚集地。"

    相关文章

      网友评论

        本文标题:Java容器类源码-Vector的最全的源码分析(三)

        本文链接:https://www.haomeiwen.com/subject/vdlarqtx.html