gpt4 book ai didi

Java ArrayList 连续内存分配仅用于引用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:04 25 4
gpt4 key购买 nike

我想分配原始数据类型对象的数组列表,如 int、char 等(不是数组,因为它将来可能不会线性增长)但需要存储在 RAM(jvm 管理的堆)中的连续内存位置。但是自从我为 ex 的原始数据类型声明 ArrayList 以来。 ArrayList为int,jvm内部映射为ArrayList 类型的对象。
现在的问题是 ArrayList 持有对存储在 jvm 管理的内存空间中不同位置的对象的连续引用。但我最初的想法是连续存储实际数据对象而不仅仅是引用!但我不知道如何实现它?

我能想到的一个解决方案是分配大尺寸字节数组,从而创建一个连续的内存缓冲区存储!如果在 2000 个预分配字节中存储了 1000 个 int 对象,开发人员需要管理如何在 101 索引位置获取一些存储在这个手动创建的缓冲区中的 int 数据(假设我们建模为 2 个字节/int)!



复杂数据类型也需要相同的功能。尽管在处理复杂对象的连续内存分配时可能很困难,因为需要计算结构大小并预分配(structureSize * 预期元素数)的字节缓冲区



对于连续分配对象(原始/复杂>),我想不出任何其他有效的方法或解决方案。任何人都可以帮助我吗?

最佳答案

没有单一的解决方案可以满足您的要求。

如果你想要一个原始类型的类似数组的结构,那么你需要使用那个原始类型的数组或者一些包装那个原始类型的数组的类1。如果您尝试实现自定义类,它不能是通用的(在原始类型上),因为原始类型不能用作通用类型参数。因此,它不能是 ArrayList 或派生自 Collection 的任何其他类型。

如果您想要引用类型的类数组结构,那么您可以使用数组或 ArrayList


简而言之,如果您不愿意使用包装器类型(Integer 等):

  • 您必须分别对待原始类型和非原始类型。
  • 最好(从 API 设计和类型安全的角度)分别对待各个基元类型。

假设地,您可以创建一个类似数组的类型,它实现了任何基本类型的数组,具体取决于运行时参数。只需定义大量方法/重载来获取/设置不同的原始类型。但是,这不是编译时类型安全的,而且 API 会丑陋 ...至少可以这么说。

您使用 ByteBuffer 的想法与上面的基本相同……或者更糟,如果您预计应用程序代码会在字节和名义上的“数组”基类型。 (你最好从 byte[] 而不是 ByteBuffer 开始。)


1 - 例如,Trove Collection 类之一。

关于Java ArrayList<primitive datatype> 连续内存分配仅用于引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18348667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com