精华内容
下载资源
问答
  • import java.util..../**** VectorTest** Description: JDK 1.8* 测试Vector的扩容方式,通过测试可以看出其每次以2的倍数形式扩充Object数组** @author Jalen* @date 2019/8/27 13:31*/public class VectorTes...

    package com.example.demo.test;

    import java.util.Vector;

    /**

    *

    * VectorTest

    *

    * Description: JDK 1.8

    * 测试Vector的扩容方式,通过测试可以看出其每次以2的倍数形式扩充Object数组

    *

    * @author Jalen

    * @date 2019/8/27 13:31

    */

    public class VectorTest {

    public static void main(String[] args) {

    createEmptyVector();

    }

    /**

    * 创建Vector

    * 调用链1(初始化):

    * {@link java.util.Vector#Vector(int)}

    * 传入capacity为2,如果为空,默认capacity是10

    * {@link java.util.Vector#Vector(int, int)}

    * 第一个参数为初始容量initialCapacity,为2,第二个参数是capacityIncrement,默认在初始化时传0

    * 该操作创建一个2个长度的Object数组,且capacityIncrement赋值为0

    * 代码:

    * super();

    * if (initialCapacity < 0)

    * throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);

    * this.elementData = new Object[initialCapacity];

    * this.capacityIncrement = capacityIncrement;

    * 调用链2:

    * {@link java.util.Vector#add(Object)}

    * synchronized修饰,modCount自增,计算容量(如果不够会执行扩容),根据下标为elementData赋值

    * 代码:

    * modCount++;

    * ensureCapacityHelper(elementCount + 1); //elementCount=0,只需确保有一个空间可用

    * elementData[elementCount++] = e;

    * return true;

    * {@link java.util.Vector#ensureCapacity(int)}

    * 这里传入的参数minCapacity为1,即我们需要的最小容量是1,elementData length是我们初始化时的容量2,此时不会扩容

    * if (minCapacity - elementData.length > 0)

    * grow(minCapacity);

    * elementData[elementCount++] = e; //因为无需扩容,直接根据数组下标赋值就好啦

    * 调用链3:

    * 此时和调用链2是一样的,不存在扩容

    * 调用链4:

    * {@link java.util.Vector#add(Object)}

    * synchronized修饰,modCount自增,计算容量(如果不够会执行扩容),根据下标为elementData赋值

    * 代码:

    * modCount++;

    * ensureCapacityHelper(elementCount + 1); //elementCount=0,只需确保有一个空间可用

    * elementData[elementCount++] = e;

    * return true;

    * {@link java.util.Vector#ensureCapacity(int)}

    * 这里传入的参数minCapacity为3,即我们需要的最小容量是3,elementData length是我们初始化时的容量2,此时会扩容

    * if (minCapacity - elementData.length > 0)

    * grow(minCapacity);

    * {@link java.util.Vector#grow(int)}

    * 计算新的容量,因为capacityIncrement初始化时是0,所以newCapacity = oldCapacity + oldCapacity,

    * 即新容量等于旧容量的2倍,elementData扩容为原来的2倍数,即4

    * 代码:

    * 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); //MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8

    * elementData = Arrays.copyOf(elementData, newCapacity);

    * 最后根据下标赋值就好啦

    * 代码:

    * elementData[elementCount++] = e;

    * 调用链5:

    * 因为上一步扩容到4,此时不会扩容

    * 调用链6:

    * 此时因为容量4已用完,会触发扩容,容量扩大到8

    */

    private static void createEmptyVector(){

    Vectorvector = new Vector<>(2); //1

    vector.add("aaa"); //2

    vector.add("bbb"); //3

    vector.add("ccc"); //4

    vector.add("ddd"); //5

    vector.add("eee"); //6

    System.out.println(vector.toString());

    }

    /**

    * 这里初始化时指定每次扩容的大小,交给用户设置

    */

    private static void createEmptyVectorWithIncrement(){

    Vectorvector = new Vector<>(2, 3);//初始容量为2,每次扩容空间为3

    vector.add("aaa"); //不扩容,容量为2

    vector.add("bbb"); //不扩容,容量为2

    vector.add("ccc"); //扩容,扩容为5

    vector.add("ddd"); //不扩容,容量为5

    vector.add("eee"); //不扩容,容量为5

    System.out.println(vector.toString());

    }

    }

    扩容方法:

    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    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);

    }

    注意不同于ArrayList的扩容方式

    ArrayList扩容公式为:newCapacity  =  oldCapacity + oldCapacity >> 1

    展开全文
  • vector容量增长方式

    2020-02-14 15:21:08
    查看vs2017中vector源码时,发现vs中vector容量扩充并不是2 * oldCapacity的增长方式,而是oldCapacity + oldCapacity / 2的增长方式,相关源代码如下: size_type _Calculate_growth(const size_type _Newsize)...

    【侯捷-SL体系结构内核分析-vector探索】

    查看vs2017中vector源码时,发现vs中vector容量的扩充并不是2 * oldCapacity的增长方式,而是oldCapacity + oldCapacity / 2的增长方式,相关源代码如下:

    在这里插入图片描述
    附:vector源代码位于文件夹:file://…/VC/Tools/MSVC/14.15.26726/include

    展开全文
  • ArrayList的默认初始容量为10 可以自定义指定初始容量(构造方法) 扩容: new.size = old.size*1.5 Vector Vector初始大小为10 扩容: new.size = old.size*2 HashMap HashMap初始大小为16 扩容: new.size = old....

    ArryList

    ArrayList的默认初始容量为10

    可以自定义指定初始容量(构造方法)

    扩容:

    new.size = old.size*1.5

    Vector

    Vector初始大小为10

    扩容:

    new.size = old.size*2

    HashMap

    HashMap初始大小为16

    扩容:

    new.size = old.size*2

    通过移位翻倍

    
    else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                         oldCap >= DEFAULT_INITIAL_CAPACITY)
                    newThr = oldThr << 1; // double threshold
    
    
    展开全文
  • }cout 看上面一段代码,输出结果为:0025DC8:10025DC8:-17891602当vector扩充容量以后,vector申请新的空间,所有原来的数据复制到新的空间上,旧的空间删除。所以数据指针尽量不要指向经常变动的vector数据之上。...

    vector<int> vecInt;

    int a =1;

    vecInt.push_back(a);

     

    int* pA = &vecInt[0];

     

    cout << pA << ":" << *pA << endl;

     

    for (int i = 0; i < 16; i++)

    {

    vecInt.push_back(i);

    }

     

    cout << pA << ":" << *pA << endl;

     

    看上面一段代码,输出结果为:

    0025DC8:1

    0025DC8:-17891602

     

    当vector扩充容量以后,vector申请新的空间,所有原来的数据复制到新的空间上,旧的空间删除。所以数据指针尽量不要指向经常变动的vector数据之上。

     

    解决办法有2个:

    1、直接复制元素实体出去使用。

    2、估算vector在工程中的大小,初始化时初始化足够大的大小来存储vector元素。

    展开全文
  • vector

    2019-03-02 23:36:54
    vector是STL中最常见的容器,它是一种... 而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量vector扩充机制:按照容器现在容量的一倍进行增长。 vector容器分配的是一块...
  • 用一道选择题作为本文的开始吧! ArrayList list = new ArrayList(20);中的list扩充几次 A.0 B.1 C.2 D.3 答案:A 1、ArrayList的默认初始容量为10,当然也...比如:初始容量为4,其容量的每次扩充后的新容量为:4-...
  • Vector HashMap HashTable HashSet 默认初始长度 16 16 10 10 16 11 16 带参(k/str)初始长度 k/str.length()+16 k/str.length()+16 k k 2^k 2^k k 负载因子 null null 1 1 0.75 1 0.75 扩充机制 n+len n+...
  • STL vector

    2021-01-06 18:49:34
    vector与array对比,最大的差别在于空间的运用的灵活性,vector是动态空间,随着元素的加入,它...为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求容量要更大一些,以备将来的扩容。因为如果一旦
  • vector 简介

    2019-04-21 11:25:00
    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似, 不同的地方就是:数组是... vector扩充机制:按照容器现在容量...
  • 我们希望向量能够根据实际需要,动态地扩充数组的容量。当然, Java 语言本身并不支持这一功能,与多数程序语言一样, Java 中数组的容量都是固定的。我们的策略是,一旦数组空间溢出(即size≥CAPACITY),
  • Java vector

    2019-10-27 12:17:42
    Java vector vector & ArrayList 底层数据结构相同,都是Object类型的数组 (1)Vector的add()方法是...(3)Vector 是在调用构造方法时,直接初始化容量为10,ArrayList是在第一次调用添加方法时,初始化,容量...
  • vector

    2020-09-05 21:59:54
    vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量vector扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在...
  • vector原理

    2018-05-14 12:35:43
    vector是STL中最常见的容器,它...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量vector扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存...
  • Read_Vector

    2017-05-08 09:38:03
    扩充容量的方法ensureCapacityHelper。与ArrayList相同,Vector在每次增加元素(可能是1个,也可能 是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就先看构造方法中 传入的...
  • vector容器

    2016-11-22 09:53:06
    vector容器 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector扩充机制:
  • 偶然看到一道题,ArrayList list = ...中的list扩充几次? 答:0次; 在不指定容量的情况下,是需要扩容的,但是这里已经指定了容量为20,所以不需要扩容。 1.ArrayList、Vector(List): ArrayList非同步 线...
  • C++ vector

    2019-04-02 21:55:13
    vector容量管理:超出部分并不是在原有空间后追加,(因为无法保证原空间之后尚有可配置的空间),而是申请更大的空间,然后将原数据拷贝新空间,并释放原空间。所以一旦引起空间的重新配置,指向原vector的所有迭代器就...
  • Vector 总结

    2014-11-24 20:03:47
    ector简介 vector是STL中最常见的容器,它是一种顺序容器,支持...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector扩充机制:按照容器现在容量的一倍进行增长。v
  • Vector(一)

    2018-11-13 23:21:13
    1.STL:C++中的一个标准模板库,分为十个容器。 STL中的vector容器: 2.vector是一个矢量容器,是对数组进行包装之后的,功能和数组较为... 扩容:STL的vector每次扩充容量时,新的容量都是前一次的两倍。把之...
  • ArrayList Vector LinkedList 类 均在java....ArrayList 初始容量为10 默认扩充容量为原来的1.5倍 Vector 默认扩充为原来的两倍 2)ArrayList 线程不安全 Vector 是线程安全的 有Synchronized的使用 LinkedList 是采用
  • vector基本用法

    2017-05-03 21:13:22
    vector是STL中最常见的容器,它是一种顺序... 而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量vector扩充机制:按照容器现在容量的一倍进行增长。 vector容器分配的是一
  • 我们希望向量能够根据实际需要,动态地扩充数组的容量。当然, Java 语言本身并不支持这一功能,与多数程序语言一样, Java 中数组的容量都是固定的。我们的策略是,一旦数组空间溢出(即size≥CAPACITY), ...
  • c++之vector

    2016-03-24 21:39:00
    vector是STL中最常见的容器,它是一种顺序容器,支持...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机 制不断扩充自身的容量vector扩充机制:按照容器现在容量的一倍进行增长。vector...
  • C++之vector

    2017-04-17 15:30:15
    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量vector扩充机制:按照容器现在容
  • C++ STL之vector

    2018-07-31 16:49:38
    STL的vector每一次扩充容量时,新的容量都是前一次的两倍(VS测试并不是这样的)。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是...
  • Java集合类源码分析

    2016-12-13 18:41:00
    常用类及源码分析 ...扩充容量的方法 ensureCapacityHelper很多方法都加入了synchronized同步语句,来保证线程安全Vector中也允许元素为nullVector现在已经基本不再使用 ...
  • vector优缺点说明

    2020-06-11 16:10:55
    vector在开始就创建适合的容量,防止自动扩充大小,节省内存。 ##优点 访问元素方便,因为内存是连续的 ##缺点 插入和删除效率低,复杂度高f(n) 当元素超出容量时,重新分配内存空间,扩充一倍。元素拷贝到新空间,...
  • Vector容器学习

    千次阅读 2012-08-16 11:45:26
    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:... vector扩充机制:按照容器现在容量的一倍进
  • vector 基本用法详解

    千次阅读 2016-08-27 21:31:03
    vector是STL中最常见的容器,它是一种顺序... 而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量vector扩充机制:按照容器现在容量的一倍进行增长。 vector容器分配的

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 177
精华内容 70
关键字:

vector扩充容量