【问题标题】:How are primitive arrays implemented in java?java中的原始数组是如何实现的?
【发布时间】:2013-04-23 22:54:16
【问题描述】:

在 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 源代码,但我真的找不到我要找的东西。 (也许那部分代码是专有的?)

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

提前致谢!

【问题讨论】:

  • 最有可能的是,它们只是普通的 C 数组,外加一些簿记信息。记住 Java 数组是固定长度的
  • 这很有意义。谢谢一月。

标签: java arrays algorithm


【解决方案1】:

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

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

【讨论】:

  • 你能举个例子吗?谢谢。
  • @minhcat_vo 什么样的例子?是header的例子,还是accessor代码的例子?
  • @minhcat_vo 标头可以是{Obj **class, int length, Obj **elems[]}(如果引用实现为指向指针的指针)。
  • @minhcat_vo 数组读取器可以是if(index < 0 || index > length) throwNew("ArrayIndexOutOfBoundsException"); return elems[index]}
  • @minhcat_vo 实际上,我的标头缺少垃圾收集信息。让我们希望它被继承;-)
【解决方案2】:

我会说和CC++一样

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

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

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

【讨论】:

  • 谢谢拉胡尔,这是一个很好的答案。 (感谢您提供一些代码!)但是,Tom 还指出数组没有插入/追加/删除,所以我会接受他的回答,但也赞成你的回答。
【解决方案3】:
  1. my_arr[1] = "whatevs";这会将数组中的第一个元素设置为 whatevs。

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

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

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

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

【讨论】:

  • 这与基本/高级无关。这是一个关于如何实现数组的算法问题。一个简单的链表在 O(n) 时间内检索一个元素,而数组在 O(1) 时间内完成,这是因为它们根本不同。感谢您的回复,是的,我知道数组是基于 0 的。
  • What really needs to be understood that each element in an array can be an object or a primitive 这是错误的,在java中只有对象引用存储在数组中,而不是对象本身。在 C++ 中可以生成对象数组,在 java 中不行!如果你有一个对象数组,它实际上是一个对象引用数组。然后每个元素都指向该对象所在的堆中的一个位置。
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 2019-05-23
  • 2014-03-16
  • 2013-08-19
  • 2014-04-10
相关资源
最近更新 更多