Java 为什么数组是';长度是不变的吗?

Java 为什么数组是';长度是不变的吗?,java,arrays,Java,Arrays,为什么数组的长度是不可变的(至少在java中是如此)?我对编程语言的内部工作几乎一无所知,所以对我来说,数组的长度很容易改变。我假设数组长度不可变有一个很好的理由,可能与性能有关。有人知道这个原因吗 对不起,如果以前有人问过这个问题。如果有,我在大约10分钟的搜索中没有找到它 编辑:我知道当一个数组被初始化时,会分配一定数量的内存。为什么不能分配更多内存?如中所述: 数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,其长度是固定的 由于结构本身的原因,长度

为什么数组的长度是不可变的(至少在java中是如此)?我对编程语言的内部工作几乎一无所知,所以对我来说,数组的长度很容易改变。我假设数组长度不可变有一个很好的理由,可能与性能有关。有人知道这个原因吗

对不起,如果以前有人问过这个问题。如果有,我在大约10分钟的搜索中没有找到它

编辑:我知道当一个数组被初始化时,会分配一定数量的内存。为什么不能分配更多内存?

如中所述:

数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,其长度是固定的

由于结构本身的原因,长度是固定的。定义一个元素时,指定一定数量的元素,必须为其分配一定数量的内存

如果必须“调整”数组的大小,则必须创建一个容量更大的数组,并将现有元素复制到该数组中。有很多方法可以做到这一点


编辑
创建数组时,会分配一定数量的内存,足以存储所需实例的数量(原语的值、对象的引用)。调整数组大小意味着扩展该内存块,并且不能保证它是连续的。

与性能无关。长度是分配的大小。无法更改创建时已设置的内容。大小是实际分配的空间量,您也不能更改它


您可以做的是复制一个不同大小的数组。

一些编程语言实际上允许这样做,例如VB.net的redim函数。使用Java、C/C++等,它可以用其他数据结构(如向量和链表)来解释


此外,当元素存储在一个数组中时,它们是连续存储的(一个接一个),因此要调整它的大小,支持它的语言在幕后所做的就是以新的大小创建一个新数组,并将内容转储到其中(在VB.net的情况下,您必须明确告诉它也要复制原始内容,iirc)动态调整数组大小的真正问题是,您需要提前知道数组可能会有多大,以便分配适当数量的连续内存来存储所有元素。

这个问题的本质在于语言设计者如何选择划分语言需要执行的任务执行,并将其分配给不同的构件

在Java中,标准数组类型有一个固定的长度,因为它是一个低级的、基本的实现,开发人员可以在此基础上构建

相反,如果您想要功能更全面的数组,请查看
ArrayList
类。其目的是为您的开发人员提供多种工具选择,以便您随时可以选择适合此工作的工具

当谈到数组时,允许可变长度数组所需的机制是非常重要的。因此,Java的创建者选择将此功能放在
ArrayList
类中,而不是让任何只想要一个简单数组的人都必须使用它

为什么延长数组不重要?计算机内存是有限的,所以我们必须将对象相邻地存储。当您想延长数组时,如果附近的内存地址中已经有另一个对象怎么办


在这种情况下,没有足够的空间来适当地延长阵列,因此必须移动数据以腾出空间。通常,这是通过找到一个更大的空内存块,并在延长阵列的同时复制阵列来完成的。如何以尽可能好的方式做到这一点的数学方法(例如,留下多少空空间?)有趣且不平凡。
ArrayList
为您抽象了这个过程,因此您不必自己处理它,您可以确信
ArrayList
类的设计者选择了一个性能良好的实现(平均而言)这是一种设计选择。它不是关于Java内部的工作方式,而是让程序员有更多的自由只使用他们需要的资源


一个可变长度的集合,如
ArrayList
具有多种方法、指针和开销。如果您的数据在短时间内不打算改变大小,为什么要改变这种开销呢?

Java既支持长度不可变的数组,也支持大小可以改变的
ArrayList
对象atter涉及额外的开销;如果为数组分配了一定的大小,并且您以后希望使其更大,那么通常情况下,要么代码必须为更大的数组分配新的空间并移动整个数组,要么
ArrayList
必须使用链接来实现,这会使其遍历速度变慢,或者可能是所以这是一种折衷,你可以选择最适合你需要的。我所知道的语言只提供第二种数组(Perl、JavaScript、PHP)我认为,所有的都是解释语言,这意味着用这些语言运行程序本质上会比较慢;这可能是这些语言的设计者认为性能不那么重要的原因。

几乎任何语言的数组都有固定的大小。这与内存分配有关:当你告诉Ja时如果你想要一个大小为N的数组,它会输出并分配一个连续的内存块。大小由N*(单个元素的大小)决定。无法更改大小的原因是无法保证在m中数组的前后是什么