您现在的位置是:首页 > 正文

Vector扩容机制源码分析

2024-02-01 04:41:57阅读 4

再来稍微聊一下Vector的特点。

继承树

Vector继承树如下图:
在这里插入图片描述

特点

(1)允许null值

(2)底层使用动态对象数组Object[] elementData

(3)默认初始容量是10,也可通过构造函数指定初始容量(实际分配值)

(4)线程安全,通过synchronized锁得以保证

(5)fail-fast机制

(6)扩容与capacityIncrement参数相关,若此参数大于0,则按该值扩增容量,否则,成倍扩增

(7)如果需要扩容,则先扩容,再插入元素。

扩容机制---源码分析

以addElement方法为例:

	/**
     * Adds the specified component to the end of this vector,
     * increasing its size by one. The capacity of this vector is
     * increased if its size becomes greater than its capacity.
     *
     * <p>This method is identical in functionality to the
     * {@link #add(Object) add(E)}
     * method (which is part of the {@link List} interface).
     *
     * @param   obj   the component to be added
     */
    public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }
    
	/**
     * This implements the unsynchronized semantics of ensureCapacity.
     * Synchronized methods in this class can internally call this
     * method for ensuring capacity without incurring the cost of an
     * extra synchronization.
     *
     * @see #ensureCapacity(int)
     */
    private void ensureCapacityHelper(int minCapacity) {
    	//容量保证,数组容量满了之后才会触发扩容
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

再看扩容方法的核心:

	/**
     * The maximum size of array to allocate.
     * Some VMs reserve some header words in an array.
     * Attempts to allocate larger arrays may result in
     * OutOfMemoryError: Requested array size exceeds VM limit
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        //根据capacityIncrement参数值决定扩容容量:指定值扩容/成倍扩容
        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);
    }

    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }
关于Stack

Stack的继承树:
在这里插入图片描述
Stack继承了Vector,也是线程安全的,方法上使用了synchronized锁。正如它的名字,它是一种先进后出的栈结构。

网站文章

  • 算法思想 - 动态规划算法

    算法思想 - 动态规划算法

    在 A[i] - A[i - 1] == A[i - 1] - A[i - 2] 的条件下,{A[i - 2], A[i - 1], A[i]} 是一个等差递增子区间。如果 {A[i - 3], A[...

    2024-02-01 04:41:25
  • vim傻瓜式配置 + git clone的速度慢到难以忍受问题的解决方法~

    vim傻瓜式配置 + git clone的速度慢到难以忍受问题的解决方法~

    一般在github上面看到一个好的开源项目,想要使用它,或者想要研究一下它的源码,这时我们需要使用git clone命令。 git clone就是仓库克隆,把服务端的仓库克隆到本地,和git push...

    2024-02-01 04:41:19
  • 卷积神经网络为什么会这么有效?分析卷积神经网络背后的奥秘

    卷积神经网络为什么会这么有效?分析卷积神经网络背后的奥秘

    From:http://m.elecfans.com/article/669524.html在机器视觉和其他很多问题上,卷积神经网络取得了当前最好的效果,它的成功促使我们思考一个问题,卷积神经网络为什么会这么有效?在本文中,SIGAI将为大家分析卷积神经网络背后的奥秘。思想起源在各种深度神经网络结构中,卷积神经网络是应用最广泛的一种,它由LeCun在1989年提出[1]。卷积神经网络在...

    2024-02-01 04:41:11
  • flush() 不能按顺序输出时解决方法

    如果是在linux下, 首先确认是否添加 ob_start() 和 ob_flush().ob_start();for ($i=1; $i<=10; $i++) { echo $i."<br />\n"; ob_flush(); flush(); usleep(500000);}如...

    2024-02-01 04:40:42
  • 腾讯云服务器价格多少钱?2023年腾讯云轻量服务器价格信息整理汇总

    腾讯云服务器价格多少钱?2023年腾讯云轻量服务器价格信息整理汇总

    1、腾讯云轻量应用服务器,入门型-2核2G-50G-300G:2核2G4M,300GB月流量, 135 15个月或540 三年。2、腾讯云轻量应用服务器,入门型-2核4G-60G-500G:2核4G5...

    2024-02-01 04:40:37
  • html如何设置文本框透明度,div设置透明度

    #a{ background:#FFCC33; filter:alpha(opacity:0); width: 300px; heig#a{background:#FFCC33; filter:alp...

    2024-02-01 04:40:30
  • Android之按钮点击事件(单击、双击、长按等)

    因为按钮双击时仍然会先触发单击事件。如果只需要处理双击事件的话则不需考虑这一点,如果要在同一个按钮单击或双击时处理不同的内容,则需在双击时过滤掉单击事件。双击时过滤单击事件的思路可参考以前在Qt中的应...

    2024-02-01 04:40:24
  • 数组小和

    数组小和的定义如下: 例如,数组s=[1,3,5,2,4,6],在s[0]的左边小于或等于s[0]的数的和为0,在s[1]的左边小于或等于s[1]的数的和为1,在s[2]的左边小于或等于s[2]的数的和为1+3=4,在s[3]的左边小于或等于s[3]的数的和为1,在s[4]的左边小于或等于s[4]的数的和为1+3+2=6,在s[5]的左边小于或等于s[5]的数的和为1+3+5+2+4=1...

    2024-02-01 04:39:52
  • 【C++】哈希应用

    【C++】哈希应用

    常见哈希函数,如直接定制,除留余数,平方取中,折叠法等,以及位图的应用,使用C++模拟实现位图。了解布隆过滤器原理,并且模拟实现,对布隆过滤器的性能以及优缺点进行评估,哈希切割介绍

    2024-02-01 04:39:45
  • 关于《程序员面试宝典》中一道面试题的答案

    说明:本文是前段时间发表在CSDN上的文章。后来通读了《程序员面试宝典》,发现里面给出的错误答案很多,所以除非是你特别明确的问题,不要轻易相信其中的结论:) 今天一朋友拿着《程序员面试宝典》来和我商量一道题目,以前听说过这本书的大名,一直无缘得见,今日一见,信手一翻,对于求职的程序员来说的确是一本不错的书:)下面就是朋友谈及的那个问题(括号中的中文是作者翻译的):

    2024-02-01 04:39:38