前提:这个问题可能是已知的,并且我可能使用了错误的措辞,如果是这种情况,请在其他地方引用我。
问题快速概述:我必须存储大量整数数组以避免重复。我正在执行以下操作:
LinkedList<int[]> ArraysAlreadyUsed;
使用数组后,我将其添加到列表中。在使用数组之前,我会查看它是否在列表中。由于我需要使用许多高维数组,因此遇到了内存问题。
问题:为了最大限度地减少占用的内存量,最好的/最好的方法是什么? 有没有办法用哈希字符串表示此类数组?这样会更好吗?
最佳答案
创建一个实现 equals
和 hashcode
的包装器可能是有意义的,以便您可以将数组放置在 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/