在S.O.上有几个与此类似的问题,但它们并没有完全回答代码实现的问题。我看了
Why isn't there a java.lang.Array class? If a java array is an Object, shouldn't it extend Object?
和
How are arrays implemented in java?
他们没有回答具体实施的内容。
我已经从OpenJDK下载了java源码,我真的找不到我要找的东西。 (也许这部分代码是专有的?)
my_arr[500]
实现的算法是什么,以获得索引500处的值?提前致谢!
答案 0 :(得分:5)
阵列上没有附加,插入或删除。
合理实现中my_arr[500]
的地址将是对象的基地址,加上标题的小偏移量,加上数组元素大小的500倍。显然你需要进行范围检查 - 偏移需要是非负的并且小于数组的长度(存储在标题中)。
答案 1 :(得分:2)
我会说与C
或C++
当我们int a[10];
或Object obj[10];
时
编译器分配的内存块等于10*sizeOf(int)
或10*sizeOf(Object)
内存块中第一个位置的地址存储在a
中。所以基本上a
成了指针。注意Java internally uses Pointers
。
然后每当我们尝试访问a[5]
时,地址都被计算为指针arithematic。
a+5*(sizeOf(int))
或obj+5*(sizeOf(Object))
然后将sizeOf(int)
或sizeOf(Object)
个字节作为值
答案 2 :(得分:0)
my_arr [1] =“whatevs”;这会将数组中的第一个元素设置为whatevs。
System.out.print(my_arr [500]); // my_arr [#]是数组中元素500的内存位置,调用它来获取存储在那里的任何信息。 (实际上500个元素将超出界限,你要寻找的元素是499.因为数组总是从0开始并且达到它们的设定值-1)
3.要删除信息,您可以执行其中一项操作,但将其设置为“null”或复制数组,只需省略您不想包含的部分。
您将使用一种方法在程序中执行所有这些操作以呈现另一种效果。真正需要理解的是,数组中的每个元素都可以是对象或原语,即。数字值,如10。
如果所有这些对您来说都是基本的,那么您需要更准确地解决您的问题,或者只是解释您尝试使用数组做什么。