Java:整数数组的内存高效存储

标签 java arrays list hash

前提:这个问题可能是已知的,并且我可能使用了错误的措辞,如果是这种情况,请在其他地方引用我。

问题快速概述:我必须存储大量整数数组以避免重复。我正在执行以下操作:

LinkedList<int[]> ArraysAlreadyUsed;

使用数组后,我将其添加到列表中。在使用数组之前,我会查看它是否在列表中。由于我需要使用许多高维数组,因此遇到了内存问题。

问题:为了最大限度地减少占用的内存量,最好的/最好的方法是什么? 有没有办法用哈希字符串表示此类数组?这样会更好吗?

最佳答案

创建一个实现 equalshashcode 的包装器可能是有意义的,以便您可以将数组放置在 O( 的 Set 中1) 包含/添加。像这样的东西:

public class IntArray {
  private final int[] array;
  private final int hash;

  public IntArray(int[] array) {
    this.array = array;
    this.hash = Arrays.hashCode(this.array); //cache hashcode for better performance
  }

  @Override
  public int hashCode() {
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    final IntArray other = (IntArray) obj;
    return Arrays.equals(this.array, other.array);
  }
}

然后您可以简单地使用一组:

Set<IntArray> arrays = new HashSet<> ();

这会产生很小的开销(估计每个包装器不到 20 个字节),但性能会比 LinkedList 好得多。

如果内存是您唯一关心的问题,那么您可以选择 int[][] 但这会更痛苦......

关于Java:整数数组的内存高效存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29391536/

相关文章:

java - 编译器错误 : "Cursor cannot be resolved to a type"

javascript - 在 Javascript 中重新创建一个查找表

c++ - 我应该用什么值填充数组以指示空白?

python - 创建 "A"和 "B"字母表的群体,每个字母表的频率为 50%

list - Prolog 中的复合术语和列表

c++ - 应用于 C++ 中对象列表的类似 Strcmp 的行为

java - 进度对话框阻止内容 View 切换?

java - 从ArrayList创建HashMap

java - Spring boot bean注入(inject)bean方法论

javascript - 在 HTML5 中将图像数组显示到 Canvas 的最佳方式?