SO上有几个与此类似的问题,但它们并不能完全回答代码实现是什么。我看过
为什么没有 java.lang.Array 类?如果一个java数组是一个对象,它不应该扩展对象吗?
和
他们没有回答具体的实现是什么。
我已经从OpenJDK下载了 java 源代码,但我真的找不到我要找的东西。(也许那部分代码是专有的?)
- 追加/插入是如何完成的?
- 如何检索数据?例如,如果我调用
my_arr[500]
什么算法来获取索引 500 处的值? - 删除是如何完成的?
提前致谢!
SO上有几个与此类似的问题,但它们并不能完全回答代码实现是什么。我看过
为什么没有 java.lang.Array 类?如果一个java数组是一个对象,它不应该扩展对象吗?
和
他们没有回答具体的实现是什么。
我已经从OpenJDK下载了 java 源代码,但我真的找不到我要找的东西。(也许那部分代码是专有的?)
my_arr[500]
什么算法来获取索引 500 处的值?提前致谢!
数组上没有追加、插入或删除。
在一个合理的实现中,地址my_arr[500]
应该是对象的基地址,加上头部的一个小偏移量,再加上数组元素大小的 500 倍。显然,您需要进行范围检查 - 偏移量必须是非负数并且小于数组的长度(存储在标题中)。
我会说它与C
or相同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)
字节作为值
my_arr[1] = "whatevs"; 这会将数组中的第一个元素设置为 whatevs。
System.out.print(my_arr[500]);// my_arr[#] 是数组中元素 500 在内存中的位置,调用它以获取存储在那里的任何信息。(实际上,实际的 500 个元素会超出范围,您要查找的元素是 499。因为数组总是从 0 开始并达到它们的设定量 -1)
3.要删除信息,您可以一次性完成,但将其设置为“null”或复制数组并简单地省略您不想包含的部分。
您将使用一种方法在程序中完成所有这些事情以呈现另一种影响。真正需要理解的是,数组中的每个元素都可以是对象或基元,即数字值,例如 10。
如果所有这些对您来说似乎都是基本的,那么您需要对您的问题更加准确,或者简单地解释您要对数组做什么。