Java 数组如何知道其大小?

Java 数组如何知道其大小?,java,c#,objective-c,arrays,nsarray,Java,C#,Objective C,Arrays,Nsarray,我在想——用不同的编程语言(比如Objective-C、C#和Java) 数组如何知道其大小? 当我询问数组大小(或计数)时,幕后会发生什么情况?如评论中所述,数组大小存储为某种私有变量。把它想象成一个数组类(我认为它实际上就是这样做的) 创建新数组时,它会设置该大小。如果以某种方式更改数组大小(取决于语言),将创建一个新的数组类,并将旧数组中的数据复制到新数组中。当然,还有其他一些技巧可以奏效 同样,我不确定它在某些语言中是否是这样工作的,但您可以在数组的末尾有一个特殊字符(如字符串的.\0字

我在想——用不同的编程语言(比如Objective-C、C#和Java)

数组如何知道其大小?
当我询问数组大小(或计数)时,幕后会发生什么情况?

如评论中所述,数组大小存储为某种私有变量。把它想象成一个数组类(我认为它实际上就是这样做的)

创建新数组时,它会设置该大小。如果以某种方式更改数组大小(取决于语言),将创建一个新的数组类,并将旧数组中的数据复制到新数组中。当然,还有其他一些技巧可以奏效

同样,我不确定它在某些语言中是否是这样工作的,但您可以在数组的末尾有一个特殊字符(如字符串的.\0字符),然后遍历所有片段。这当然意味着获取长度是一个O(n)运算,它不像上一个(O(1))一样是常数

如果语言中有指针,也可以使用指针。在前面有一个指针,在结尾有一个指针,然后做减法得到大小。这比O(n)方法快,但每次执行减法都需要更多指令


有多种方法可以做到这一点。如果您想了解如何在C#中实现它,可以看看Mono的实现方式。

在一种将数组视为对象的语言中,它可以在创建时存储在字段中。 例如,在Java中,可以使用数组的
length
字段查询数组的长度。 这显然不是表示数组的唯一方法

在C语言中,数组只是一个连续存储的数据块,由指向第一个块的指针表示。您可以使用
sizeof
运算符以字节为单位查询其大小。然后,可以将其总大小除以单个数据类型的大小来获得其长度。因此,如果您有一个数组
arr
sizeof(arr)/sizeof(arr[0])
将是它的长度


但这还不是全部,举个极端的例子,数组在Haskell中的工作方式非常不同。

大小存储在某个地方。这绝对应该单独使用一种编程语言。不同语言的实现可能差异很大。@nhgrif的详细信息因实现而异,但实际的源语言与此无关。(除了运行时可能无法恢复长度的广泛语言类别)Java的
.length
public
。它的getter属性是public,是的。但是,允许用户手动更改数组大小值的设计很糟糕。不,字段本身是
公共的
,但也是
最终的
,因此该问题是无效的。瞧,你不能改变。哦,好吧,我不知道。我对Java不太熟悉(我想当你假设时会发生这种情况),而是当你试图回答一个应该简单地关闭的问题时会发生什么。
Class Array
{
   Private int size;
}