2015-04-01 27 views
0

前提:这个问题可能已经知道了,我可能会使用错误的措辞,如果是这种情况,请引用我其他地方。Java:整数数组的内存高效存储

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

LinkedList<int[]> ArraysAlreadyUsed; 

使用数组时,我将它添加到列表中。在使用数组之前,我会看看它是否在列表中。因为我需要使用许多高维数组,所以遇到了内存问题。

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

+1

无论是在内存开销和迭代方面,LinkedList都是一个糟糕的选择。改用ArrayList。然而,对数组进行彻底的线性搜索似乎是一个不好的主意。 – 2015-04-01 13:03:49

+0

我不能清楚地理解你的问题,但似乎你可以解决你的问题,如果你给你的使用哈希映射到你的情况通过 – Ravikiran763 2015-04-01 13:04:47

+0

@ rave763我怎么会在这种情况下使用hashmap?我将我的整数数组映射到什么? – ZzKr 2015-04-01 13:08:15

回答

0

如果您需要检查数据结构中元素的存在,最好的解决方案是使用Map。因此请使用HashMap

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

链接列表在内存占用方面也是一个糟糕的选择。 Infact为每个元素引用前一个元素和引用下一个元素。

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

2

它可能是有意义的创建实现equalshashcode这样就可以放在一个Set阵列为O(1)contains/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); 
    } 
} 

然后,您只需使用一组:

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

这将创建一个小的开销(guestimate每包装少于20个字节),但将执行比你的LinkedList要好得多。

如果内存是你唯一关心的,那么你可以去一个int[][]但会更痛苦......

0

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