2013-04-23 75 views
0

在S.O.上有几个类似这个问题的问题,但它们并不完全回答代码实现的问题。我已经看了在java中如何实现原始数组?

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源代码,我真的找不到我在找什么。 (也许这部分代码是专有的?)

  1. append/inserts是如何完成的?
  2. 如何检索数据?例如,如果我调用my_arr[500]实现哪个算法以获取索引500处的值?
  3. 删除操作如何完成?

在此先感谢!

+2

最有可能的是,它们只是普通的C数组,还有一些簿记信息。记住Java数组是固定长度的 – 2013-04-23 22:56:53

+0

这很有意义。谢谢Jan. – maximus 2013-04-23 23:02:35

回答

5

数组上没有附加,插入或删除操作。

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

+0

你能举个例子吗?谢谢。 – 2013-04-23 23:07:45

+0

@minhcat_vo是什么样的例子?标题的例子,或访问者代码的例子? – 2013-04-23 23:09:43

+1

@minhcat_vo头部可以是'{Obj ** class,int length,Obj ** elems []}'(如果引用被实现为指向指针的指针)。 – 2013-04-23 23:14:44

1

我会说,它为的CC++当我们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)字节值

+0

谢谢拉胡尔,这是一个很好的答案。 (谢谢你提供了一些代码!)但是,汤姆也指出数组没有插入/附加/删除,所以我会接受他的回答,但也赞成你的回答。 – maximus 2013-04-25 05:55:09

0
  1. my_arr [1] = “whatevs”;这会将数组中的第一个元素设置为whatevs。 System.out.print(my_arr [500]); // my_arr [#]是数组中元素500在内存中的位置,调用它来获取存储在那里的任何信息。 (实际上是实际的500元会出界,你要寻找的元素是499.数组总是从0开始,往自己设定的数额-1)

3.To删除你的信息会做一件事情,但将其设置为“空”或复制数组,并简单地省略你不想包括的部分。

您将使用一种方法在程序中执行所有这些操作来呈现另一个影响。真正需要理解的是,数组中的每个元素都可以是对象或原语,一个数值,如10.

如果所有这些对你来说都是基本的,那么你需要对你的问题做更精确的解释,或者简单地解释你想要用数组来做什么。

+0

这不是关于如何基本/先进。这是一个关于数组如何实现的算法问题。一个简单的链表在O(n)时间内检索一个元素,数组在O(1)中执行,这是因为它们根本不同。谢谢你的回复,是的,我知道数组是基于0的。 – maximus 2013-04-23 23:20:39

+1

'真正需要理解的是数组中的每个元素都可以是一个对象或一个原语',这只是错误的,在java中,只有对象引用存储在数组中,而不是对象本身。在C++中可以生成对象数组,而不是在java中! 如果你有一个对象数组,它实际上是一个对象引用数组。每个元素然后指向该对象所在堆中的位置。 – cIph3r 2013-04-23 23:24:43