-
Java vector初始容量_简单了解java的Vector扩容
2021-03-15 01:44:30import 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 -
ArryList、Vector、HashMap扩充大小
2019-01-25 22:17:28ArrayList的默认初始容量为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
-
数据指针指向vector内元素,vector扩容后产生的错误。
2011-02-16 14:28:00}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:54vector是STL中最常见的容器,它是一种... 而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector的扩充机制:按照容器现在容量的一倍进行增长。 vector容器分配的是一块... -
java自动扩充机制实例解析(ArrayList、HashMap、Vector)
2019-06-18 10:22:29用一道选择题作为本文的开始吧! ArrayList list = new ArrayList(20);中的list扩充几次 A.0 B.1 C.2 D.3 答案:A 1、ArrayList的默认初始容量为10,当然也...比如:初始容量为4,其容量的每次扩充后的新容量为:4-... -
Java中容量扩充类参数总结
2020-10-16 21:38:16Vector 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:34vector与array对比,最大的差别在于空间的运用的灵活性,vector是动态空间,随着元素的加入,它...为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求容量要更大一些,以备将来的扩容。因为如果一旦 -
vector 简介
2019-04-21 11:25:00vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似, 不同的地方就是:数组是... vector的扩充机制:按照容器现在容量... -
Java 基于数组自定义实现容量可变向量Vector
2015-06-21 06:20:07我们希望向量能够根据实际需要,动态地扩充数组的容量。当然, Java 语言本身并不支持这一功能,与多数程序语言一样, Java 中数组的容量都是固定的。我们的策略是,一旦数组空间溢出(即size≥CAPACITY), -
Java vector
2019-10-27 12:17:42Java 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:43vector是STL中最常见的容器,它...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存... -
Read_Vector
2017-05-08 09:38:03扩充容量的方法ensureCapacityHelper。与ArrayList相同,Vector在每次增加元素(可能是1个,也可能 是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就先看构造方法中 传入的... -
vector容器
2016-11-22 09:53:06vector容器 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector的扩充机制: -
ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
2019-09-13 01:27:09偶然看到一道题,ArrayList list = ...中的list扩充几次? 答:0次; 在不指定容量的情况下,是需要扩容的,但是这里已经指定了容量为20,所以不需要扩容。 1.ArrayList、Vector(List): ArrayList非同步 线... -
C++ vector
2019-04-02 21:55:13vector容量管理:超出部分并不是在原有空间后追加,(因为无法保证原空间之后尚有可配置的空间),而是申请更大的空间,然后将原数据拷贝新空间,并释放原空间。所以一旦引起空间的重新配置,指向原vector的所有迭代器就... -
Vector 总结
2014-11-24 20:03:47ector简介 vector是STL中最常见的容器,它是一种顺序容器,支持...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector的扩充机制:按照容器现在容量的一倍进行增长。v -
Vector(一)
2018-11-13 23:21:131.STL:C++中的一个标准模板库,分为十个容器。 STL中的vector容器: 2.vector是一个矢量容器,是对数组进行包装之后的,功能和数组较为... 扩容:STL的vector每次扩充容量时,新的容量都是前一次的两倍。把之... -
ArrayList Vector 和 LinkedList的区别
2020-07-06 15:11:23ArrayList Vector LinkedList 类 均在java....ArrayList 初始容量为10 默认扩充容量为原来的1.5倍 Vector 默认扩充为原来的两倍 2)ArrayList 线程不安全 Vector 是线程安全的 有Synchronized的使用 LinkedList 是采用 -
vector基本用法
2017-05-03 21:13:22vector是STL中最常见的容器,它是一种顺序... 而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector的扩充机制:按照容器现在容量的一倍进行增长。 vector容器分配的是一 -
java向量为什么不会自动扩容_Java 基于数组自定义实现容量可变向量Vector
2021-03-10 07:22:02我们希望向量能够根据实际需要,动态地扩充数组的容量。当然, Java 语言本身并不支持这一功能,与多数程序语言一样, Java 中数组的容量都是固定的。我们的策略是,一旦数组空间溢出(即size≥CAPACITY), ... -
c++之vector
2016-03-24 21:39:00vector是STL中最常见的容器,它是一种顺序容器,支持...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机 制不断扩充自身的容量。 vector的扩充机制:按照容器现在容量的一倍进行增长。vector... -
C++之vector
2017-04-17 15:30:15vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。...而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector的扩充机制:按照容器现在容 -
C++ STL之vector
2018-07-31 16:49:38STL的vector每一次扩充容量时,新的容量都是前一次的两倍(VS测试并不是这样的)。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是... -
Java集合类源码分析
2016-12-13 18:41:00常用类及源码分析 ...扩充容量的方法 ensureCapacityHelper很多方法都加入了synchronized同步语句,来保证线程安全Vector中也允许元素为nullVector现在已经基本不再使用 ... -
vector优缺点说明
2020-06-11 16:10:55vector在开始就创建适合的容量,防止自动扩充大小,节省内存。 ##优点 访问元素方便,因为内存是连续的 ##缺点 插入和删除效率低,复杂度高f(n) 当元素超出容量时,重新分配内存空间,扩充一倍。元素拷贝到新空间,... -
Vector容器学习
2012-08-16 11:45:26vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:... vector的扩充机制:按照容器现在容量的一倍进 -
vector 基本用法详解
2016-08-27 21:31:03vector是STL中最常见的容器,它是一种顺序... 而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector的扩充机制:按照容器现在容量的一倍进行增长。 vector容器分配的