• 一天一个类,一点也不累 之 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/】

  • 相关阅读:
    Python3 tkinter基础 Canvas create_text 在画布上添加文字
    js中如何返回一个存放对象的数组?
    vs2015 出现Lc.exe 已退出,代码为-1的问题,如何解决
    微信PC客户端无法发送图片,怎么解决?
    vs2015 编译时项目出现NuGet程序包还原失败,找不到xxx.xxx.xxx版本的程序包,怎么解决这个问题?
    sql server 根据身份证号计算出生日期和年龄的存储过程
    sql server中截取字符串的常用函数
    sql server 中进行除法运算时,如何得到结果是小数形式呢?
    sql中,如何获取一个数的整数部分和余数部分
    sql 中,如何获取两个日期之前月数、周数、天数
  • 原文地址:https://www.cnblogs.com/plxx/p/4442484.html
Copyright © 2020-2023  润新知