1

SO上有几个与此类似的问题,但它们并不能完全回答代码实现是什么。我看过

为什么没有 java.lang.Array 类?如果一个java数组是一个对象,它不应该扩展对象吗?

java中的数组是如何实现的?

他们没有回答具体的实现是什么。

我已经从OpenJDK下载了 java 源代码,但我真的找不到我要找的东西。(也许那部分代码是专有的?)

  1. 追加/插入是如何完成的?
  2. 如何检索数据?例如,如果我调用my_arr[500]什么算法来获取索引 500 处的值?
  3. 删除是如何完成的?

提前致谢!

4

3 回答 3

6

数组上没有追加、插入或删除。

在一个合理的实现中,地址my_arr[500]应该是对象的基地址,加上头部的一个小偏移量,再加上数组元素大小的 500 倍。显然,您需要进行范围检查 - 偏移量必须是非负数并且小于数组的长度(存储在标题中)。

于 2013-04-23T22:59:06.013 回答
3

我会说它与Cor相同C++

当我们这样做int a[10];Object obj[10]; 编译器分配的内存块等于10*sizeOf(int)10*sizeOf(Object) 内存块中第一个位置的地址存储在a. 所以基本上a变成了指针。注意Java internally uses Pointers

然后每当我们尝试访问a[5]位置地址时,都会将其计算为指针算术。

a+5*(sizeOf(int))orobj+5*(sizeOf(Object)) 然后读取sizeOf(int)orsizeOf(Object)字节作为值

于 2013-04-23T23:04:37.160 回答
0
  1. my_arr[1] = "whatevs"; 这会将数组中的第一个元素设置为 whatevs。

  2. System.out.print(my_arr[500]);// my_arr[#] 是数组中元素 500 在内存中的位置,调用它以获取存储在那里的任何信息。(实际上,实际的 500 个元素会超出范围,您要查找的元素是 499。因为数组总是从 0 开始并达到它们的设定量 -1)

3.要删除信息,您可以一次性完成,但将其设置为“null”或复制数组并简单地省略您不想包含的部分。

您将使用一种方法在程序中完成所有这些事情以呈现另一种影响。真正需要理解的是,数组中的每个元素都可以是对象或基元,即数字值,例如 10。

如果所有这些对您来说似乎都是基本的,那么您需要对您的问题更加准确,或者简单地解释您要对数组做什么。

于 2013-04-23T23:13:27.507 回答