zoukankan      html  css  js  c++  java
  • 一天一个类,一点也不累 之 Vector

    一天一个类,一点也不累。

    今天要说的是ArrayList的亲兄弟--Vector

    亲兄弟?看看“族谱”

    Class Vector<E>
    
        java.lang.Object
            java.util.AbstractCollection<E>
                java.util.AbstractList<E>
                    java.util.Vector<E>
    
        All Implemented Interfaces:
            Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
    
        Direct Known Subclasses:
            Stack
    
    
        public class Vector<E>
        extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, Serializable
    View Code

    发现 他们俩就是亲兄弟啊~~

    The Vector class implements a growable array of objects. Like an array, it contains components that can be accessed using an integer index. However, the size of a Vector can grow or shrink as needed to accommodate adding and removing items after the Vector has been create。

    Vecotor 实现了可变的数组,和数组一样,提供了使用下标来访问对象。Vector创建之后,可以按照需求来增加或者收缩。

    Each vector tries to optimize storage management by maintaining a capacity and a capacityIncrement.

    使用capacity 和 capacityIncrecement实现存储空间的管理。capacity 容量,capacityIncrement 增长步

    1、他的构造方法有三种,

      Vector()   默认的大小为10

    Vector(Collection<? extends E> c)同样使用数组工具类Arrays的copyOf()

    Vector(int initialCapacity, int capacityIncrement) 同时指定了容器的容量和增长步长。

    2、实现了从Vector到数组的转换

      copyInto(Object[] anArray);

    3、一个很有情怀的方法

      在构造函数中,我们有些时候,初始化容量的时候,会有很多剩余空间没被使用,这样的话,就浪费了(浪费可耻!!~)

      给我们提供了一个方法,trimToSize()将容量的值,设置为当前容器的size.

    其中的实现:

        public synchronized void trimToSize() {
            modCount++;
            int oldCapacity = elementData.length;
            if (elementCount < oldCapacity) {
                elementData = Arrays.copyOf(elementData, elementCount);
            }
    View Code

    可见他也是使用Arrays.copyOf(),需要将数据拷贝一次。所以也是很消耗时间的。

    4、在这里我们也许要着重说一下Vector的增长方式

      首先呢,在构造的时候我们可以指定,capacityIncrement;如果没有指定也可以后期使用函数来指定,

        public synchronized void ensureCapacity(int minCapacity) //指定最小的增长;

    其实这个Vector可以自动增长的,

    private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                             capacityIncrement : oldCapacity);  //【如果没有指定capacityIncrement,那么newCapacity = oldCapacity+oldCapacity;就是二倍增长!!!
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            elementData = Arrays.copyOf(elementData, newCapacity);
        }

    这里就是讲这么多了,其实这个类还有好多的方法,这些方法和上次讲的ArrayList()种的方法是一样的使用,可以自行查看。

    【重要】虽说好些方法和ArrayList()使用方法是一样的,但是大家可能发现了,这个类种几乎所有的方法都是synchronized同步的!!

      这就是说相比ArrayList()这个是线程安全的。

    【谢谢大家,欢迎指正。】

    【转载请注明出处http://home.cnblogs.com/u/plxx/】

  • 相关阅读:
    MTK Sensor越界导致的系统重启问题分析报告
    WebView兼容问题分析报告
    图片格式问题分析报告
    堆内存double free问题分析报告
    Virsualizer模块野指针问题分析报告
    libjohn hook问题分析报告
    [开发技巧]·Numpy广播机制的深入理解与应用
    [深度应用]·使用一维卷积神经网络处理时间序列数据
    [开发技巧]·Numpy中对axis的理解与应用
    [开发技巧]·HTML检测输入已完成自动填写下一个内容
  • 原文地址:https://www.cnblogs.com/plxx/p/4442484.html
Copyright © 2011-2022 走看看