Java 数组和向量的内存分配是如何工作的?

Java 数组和向量的内存分配是如何工作的?,java,c++,arrays,memory-management,vector,Java,C++,Arrays,Memory Management,Vector,我知道数组的大小无法调整,而向量是一个选项 我很想知道内存分配对这两个方面都有什么作用。因为它管理一个,并将现有数据分配和复制到较新的数据。向量有一定的容量,这对应于在不调整大小的情况下可以在向量中存储多少元素-这是“引擎盖下”数组的实际大小 达到容量后,将创建长度更大的新阵列(增量可能不同,并且可以进行配置),所有元素都将复制到新阵列。在没有自动垃圾收集的语言中,应删除旧数组 这种操作的算法复杂度为O(n) 这些结构的实现对于所有编程语言几乎是相同的,至少从算法的角度来看是如此。维基链接 说到

我知道数组的大小无法调整,而向量是一个选项


我很想知道内存分配对这两个方面都有什么作用。

因为它管理一个,并将现有数据分配和复制到较新的数据。

向量有一定的容量,这对应于在不调整大小的情况下可以在向量中存储多少元素-这是“引擎盖下”数组的实际大小

达到容量后,将创建长度更大的新阵列(增量可能不同,并且可以进行配置),所有元素都将复制到新阵列。在没有自动垃圾收集的语言中,应删除旧数组

这种操作的算法复杂度为O(n)

这些结构的实现对于所有编程语言几乎是相同的,至少从算法的角度来看是如此。维基链接


说到Java,Vector类的实现是开源的,源代码通常随JDK提供。但是如果您没有,您可以在internet上找到它,例如:

正如Jigar提到的,它在内部管理阵列,下面是如何增加大小的实现(我是用Java说的):

//这确保了向量的大小
私人空间增长(单位容量){
//有溢出意识的代码
int oldCapacity=elementData.length;
int newCapacity=oldCapacity+((电容增量>0)?
容量增加:旧容量);
if(新容量-最小容量<0)
新容量=最小容量;
if(新容量-最大阵列大小>0)
新容量=大容量(最小容量);
//elementData是Object类型的数组
elementData=Arrays.copyOf(elementData,newCapacity);//为数组复制具有指定容量的指定数组
}

在Vector中添加任何数据时调用上述方法,它确保创建的新Vector的大小。

如果数组已动态分配,则可以调整数组大小。 例如,在c中,通过malloc()函数动态分配内存。您可以重新分配此内存空间,并通过realloc()更改其大小

如果以这种方式在c/c++中分配数组:

int array[5];
它将在执行声明的函数的堆栈框架中分配。
相反,向量是一个高级对象,在堆内存段上动态分配。

既然您谈论的是固定大小的数组,我假设您想要比较如下内容

int my_array[10];

vector my_vector;
在第一种情况下,程序将请求内存中所需的空间,并将该空间视为代码所遵循的连续整数

至于向量,它是一个在内部管理某些内存位置的类,因此,正如您编写的代码所示,当您向它请求一些值时,它将查找它所在的位置并给出结果

向量不会分配无限长的内存,因此如果它为十个整数分配了内存,然后添加第十一个整数,它将自动收集更多内存空间并找到保留实际值的方法

它如何取决于实现。我使用的一个会在每次需要更多时将内存空间加倍,并将以前的值复制到新位置

一些程序员喜欢编写自己的向量类,并让它每次都请求一个固定大小的内存,或者将空间乘以一个特定的常数


一些理由:

为什么没有向量的一般规则?

对不起,我不能给你一个非常通用的“向量是如何工作的”,但这正是向量的概念,他们做的工作,你不用担心它=) 每个实现都有自己的理念。 java一个我不知道,但是我必须和C++的那个类似。 为什么要把尺寸增加一倍?或者为什么要求固定尺寸?

假设您需要存储1000个整数

每次需要更多空间时,该请求空间的向量将分配10,然后加10,再加10,然后。。。一百个拨款

每次将其大小加倍的向量将为1、2、4、8、16、32、64、128、256、512、1024请求空间。只有十次分配

有些程序员不希望最后有24个空格,或者只需要一次分配(直接分配1000个),所以他们创建了一个向量类,分配一些他们认为合适的固定内存大小

<> > C++向量具有对该问题的特定功能,如ResiZe(),它将要求向量具有特定的大小,或保留(),它将要求向量在内存中保留特定的空间量。
至少,这个网站是黄金的:


这是关于C++实现的,但是这个想法是一般的。读起来很好=)

对于java:它管理数组,并在需要扩展时调整和复制数组。注意,数组的大小在某些情况下可以调整大小,即通过C库的
realloc
,和/或通过特定于系统的方式。但是,首先,
realloc
不能保证调整大小,其次,
std::vector
上的要求(我记得)是这样的,它不能在内部使用
realloc
。即使这样,通常也会大大加快事情的进展。问题是(至少现在)标记了C++,而没有提到java。@崩溃它被标记为java,它是关于数据结构的,我想,我不是一个投票否决你的人。奇怪的是,我看不到编辑历史,但我怀疑可能有标签切换。
int my_array[10];
vector<int> my_vector;