Java:内存有效存储整数数组

时间:2015-04-01 13:00:46

标签: java arrays list hash

前提:这个问题可能已经知道了,我可能会使用错误的措辞,如果是这种情况,请在别处推荐我。

快速问题概述:我必须存储大量的整数数组,以避免重复。我正在做以下事情:

LinkedList<int[]> ArraysAlreadyUsed;

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

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

3 个答案:

答案 0 :(得分:2)

创建一个实现equalshashcode的包装器可能是有意义的,这样您就可以将数组放在Set中,用于O(1)contains / { {1}}。类似的东西:

add

然后你可以简单地使用一套:

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);
  }
}

这将产生一个小的开销(每个包装器的估计少于20个字节),但是它的性能会比LinkedList好得多。

如果记忆是你唯一的问题,那么你可以选择Set<IntArray> arrays = new HashSet<> (); ,但这会更痛苦......

答案 1 :(得分:0)

如果您需要检查数据结构中是否存在元素,最佳解决方案是使用Map。所以使用HashMap

元素的检索发生在 O(1)中。在列表(LinkedListArrayList)中,搜索在 O(n)中进行。

链接列表在内存占用方面也是一个糟糕的选择。事实上,每个元素都有对前一个元素的引用和对下一个元素的引用。

就内存占用而言,最好的解决方案是使用int(不是ArrayList)数组,并引用最后插入的id。

答案 2 :(得分:0)

使用BitSet代替int[]可能会减少内存占用。