如何使用Java实现类数组的数据结构?
How to implement an array-like data structure using Java?
我知道数组是什么以及如何使用它们。但是,我不知道它们是如何实现的。我试图弄清楚是否可以尝试使用 Java 实现类似数组的数据结构,但我做不到。
我在网上搜索过,但没有找到任何有用的东西。
甚至可以在 Java 中实现类似数组的数据结构吗?可以用其他语言吗?如果是的话如何(当然不使用数组)?
编辑:我想知道的是如何在不使用数组的情况下实现数组数据结构?
数组是内存中的连续部分,因此要创建一个数组,您需要保留一块大小为 n * sizeof(type)
的内存,其中 n
是您想要的项目数量存储并且 sizeof(type)
将 return 大小,以字节为单位,JVM 需要表示该给定类型。
然后你会存储一个引用(指针)到你的内存段的第一个位置,比如0x00
,然后你用它作为基础知道您需要移动多少才能访问这些元素,因此 a[n]
等于 0x00 + (n * sizeof(type))
。
问题 试图在 Java 中实现它是 Java 不允许指针操作,所以我不认为构建你自己的数组类型是可能的,因为你不能下降到那个级别。
也就是说,您应该能够创建链接数据结构,其中 nth
元素指向 (n + 1)th
元素。
为什么您应该尝试其他语言的其他问题,例如 C#
(检查 unsafe
操作)、C++
或 C
:
- 据我所知,Java 没有
sizeof
函数(参见 this)。
- Java 不允许
operator overloading
。所以你不能定义你自己的索引运算符,比如[index]
。您可能需要执行类似 array.getElementAt(0)
的操作才能获取第一个元素。
正如@ug_ 所推荐的,您可以查看不安全 class。但也正如他所建议的那样,我认为您不应该使用以 指针抽象 作为其核心思想之一的语言来进行指针运算。
如果你想要的是这样的:
MyArray ma = new MyArray(length);
ma[0] = value;
那么您无法在 Java 中执行此操作,但您可以在其他语言中执行此操作。寻找 "operator overloading".
我想知道您是否考虑过结构、向量或 link 列表。这些都类似于数组,但又有所不同。
java 中并没有真正的结构,但您可以实现它们。
在此处阅读有关结构的信息:
www.cplusplus.com/doc/tutorial/structures/
java中使用的结构示例:
Creating struct like data structure in Java
我认为您真正需要的是矢量。它们与数组非常相似,但它们不是数组。
向量信息:
www.cplusplus.com/reference/vector/vector/
数组与向量的比较:
https://softwareengineering.stackexchange.com/questions/207308/java-why-do-we-call-an-array-a-vector
我推荐一个 link 列表。它有点像数组的想法,但不知道你的确切大小。更容易实现。
Link 列出:
en.wikipedia.org/wiki/Linked_list
所有这些归结为需要他们做什么的情况。说,"what I want to know is how to implement an array data structure without using arrays?" 有点开放式。
我知道数组是什么以及如何使用它们。但是,我不知道它们是如何实现的。我试图弄清楚是否可以尝试使用 Java 实现类似数组的数据结构,但我做不到。
我在网上搜索过,但没有找到任何有用的东西。
甚至可以在 Java 中实现类似数组的数据结构吗?可以用其他语言吗?如果是的话如何(当然不使用数组)?
编辑:我想知道的是如何在不使用数组的情况下实现数组数据结构?
数组是内存中的连续部分,因此要创建一个数组,您需要保留一块大小为 n * sizeof(type)
的内存,其中 n
是您想要的项目数量存储并且 sizeof(type)
将 return 大小,以字节为单位,JVM 需要表示该给定类型。
然后你会存储一个引用(指针)到你的内存段的第一个位置,比如0x00
,然后你用它作为基础知道您需要移动多少才能访问这些元素,因此 a[n]
等于 0x00 + (n * sizeof(type))
。
问题 试图在 Java 中实现它是 Java 不允许指针操作,所以我不认为构建你自己的数组类型是可能的,因为你不能下降到那个级别。
也就是说,您应该能够创建链接数据结构,其中 nth
元素指向 (n + 1)th
元素。
为什么您应该尝试其他语言的其他问题,例如 C#
(检查 unsafe
操作)、C++
或 C
:
- 据我所知,Java 没有
sizeof
函数(参见 this)。 - Java 不允许
operator overloading
。所以你不能定义你自己的索引运算符,比如[index]
。您可能需要执行类似array.getElementAt(0)
的操作才能获取第一个元素。
正如@ug_ 所推荐的,您可以查看不安全 class。但也正如他所建议的那样,我认为您不应该使用以 指针抽象 作为其核心思想之一的语言来进行指针运算。
如果你想要的是这样的:
MyArray ma = new MyArray(length);
ma[0] = value;
那么您无法在 Java 中执行此操作,但您可以在其他语言中执行此操作。寻找 "operator overloading".
我想知道您是否考虑过结构、向量或 link 列表。这些都类似于数组,但又有所不同。
java 中并没有真正的结构,但您可以实现它们。
在此处阅读有关结构的信息: www.cplusplus.com/doc/tutorial/structures/
java中使用的结构示例: Creating struct like data structure in Java
我认为您真正需要的是矢量。它们与数组非常相似,但它们不是数组。
向量信息: www.cplusplus.com/reference/vector/vector/
数组与向量的比较: https://softwareengineering.stackexchange.com/questions/207308/java-why-do-we-call-an-array-a-vector
我推荐一个 link 列表。它有点像数组的想法,但不知道你的确切大小。更容易实现。
Link 列出: en.wikipedia.org/wiki/Linked_list
所有这些归结为需要他们做什么的情况。说,"what I want to know is how to implement an array data structure without using arrays?" 有点开放式。