美文网首页
Vector 中遇到的Arrays.copyOf()

Vector 中遇到的Arrays.copyOf()

作者: 李逍遥JK | 来源:发表于2018-11-14 20:02 被阅读10次

    http://www.iteedu.com/plang/java/javadiary/24.php
    https://blog.csdn.net/zhouxukun123/article/details/79314175

    1.为什么使用迭代器遍历Vector最慢

    2.Verctor重要方法实现

    Vector的grow函数

       // 传入参数 minCapacity
       private void grow(int minCapacity) {
            // overflow-conscious code
            // 获取老的长度
            int oldCapacity = elementData.length;
            // 如果构造函数中设置了capacityIncrement并且大于0,那么新的长度
            // = 老长度+ capacityIncrement 否则 等于 老长度 + 老长度
            int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                             capacityIncrement : oldCapacity);
            // 如果新的长度仍然小于 minCapacity 那么 新长度 = 传入的minCapcity
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            // 长度超过最大长度 设置为HugeCapacity
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            // 拷贝数组 多余的用 E 的初始值填充,比如 E 为对象就填null;Integer --> null; int --> 0
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    

    hugeCapacity(int minCapacity)函数

        // Integer.MAX_VALUE = 2^31; DEC: 2147483647
        @Native public static final int   MAX_VALUE = 0x7fffffff;
        private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
        private static int hugeCapacity(int minCapacity) {
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            // Ma
            return (minCapacity > MAX_ARRAY_SIZE) ?
                Integer.MAX_VALUE :
                MAX_ARRAY_SIZE;
        }
    
    

    Vector的removeElementAt(int index)函数:移除对应索引的元素

        public synchronized void removeElementAt(int index) {
            // fail-fase机制,及异常处理
            modCount++;
            if (index >= elementCount) {
                throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                         elementCount);
            }
            else if (index < 0) {
                throw new ArrayIndexOutOfBoundsException(index);
            }
            // 计算索引index后面的元素个数
            int j = elementCount - index - 1;
            if (j > 0) {
                // 将原数组从index + 1后面开始的全部元素拷贝到原数组index位置上
                System.arraycopy(elementData, index + 1, elementData, index, j);
            }
            // 长度 -1
            elementCount--;
            // 将数组最后一位置为空,让GC回收垃圾
            elementData[elementCount] = null; /* to let gc do its work */
        }
    

    Vector迭代:

            Vector v = new Vector(10, 10);
            v.add("!");
            Iterator it  = v.iterator();
            while (it.hasNext()){
                System.out.println(it.next());
            }
        }
    

    相关文章

      网友评论

          本文标题:Vector 中遇到的Arrays.copyOf()

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