前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java集合---Vector(4)

Java集合---Vector(4)

作者头像
兜兜毛毛
发布2019-10-23 15:52:38
2720
发布2019-10-23 15:52:38
举报
文章被收录于专栏:兜兜毛毛兜兜毛毛

用途与特点 可用于在需要存储有序的,可动态扩充线程安全的集合。整理逻辑算法上基本与ArrayList相同,但在操做数据的方法上都使用了synchronized关键字,在多 线程调用时,会将并行请求,变为串行请求,因为使用了synchronized方法,所以他的性能方面比ArrayList要差。建议在非线程下使用ArrayList。

实现算法

底层实现方式其实就是Object[]数组实现,根据封装会存储实际存储大小elementCount对象,与存放数据的elementData。算法基本与ArrayList相同。

默认初始数组长度是10,最大集合长度是Integer.MAX_VALUE大概21亿多

添加

Vector添加扩容
Vector添加扩容

删除

删除逻辑
删除逻辑

在删除数据时只会对数组进行移到操作,并不会修改调整数组的长度,所以对于内存方面如创建一个长度是100的数据集合,删除了90个数据,集合数组长度也不会缩小。

代码语言:javascript
复制
public synchronized E remove(int index) {
        modCount++;
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
        E oldValue = elementData(index);

        int numMoved = elementCount - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--elementCount] = null; // Let gc do its work

        return oldValue;
    }

扩容机制

扩容时机:是在加入数据时,elementData已满时进行扩容

扩充的新数组长度是: 原数组长度 + (原数组长度 / 2)

代码语言:javascript
复制
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);//根据实例化时可传入扩容大小,如不传入则按原数组大小的两倍扩容
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

是否线程安全,为什么?

线程安全,在源码中对数据操作使用synchronized方法,保证了并发锁。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档