对象数组与列表+索引数组

时间:2016-12-03 16:32:49

标签: java arrays performance list memory

假设您在对象中有10个索引引用(#0到9)。但是,其中2个在我们班级的特定实例中未使用(例如,#3和#8)。 这是我的问题: 内存和性能方面,最好的选择是:长度为10的引用数组,索引为3和8的空值,或者是一个大小为8的列表,以及一个指向该列表中引用索引的int数组?

解决方案1看起来像这样:

class SomeObject{
    OtherObject[] references = new OtherObject[10];
    {
        for(int i = 0; i<10; i++){
            if(i != 3 && i != 8)
                references[0] = new OtherObject();
            //otherwise just keep the null value
        }
    }

    //then to use (here getting the toString() value)
    String getStringOfObjectAtIndex(int index){
        //in real code we'd first check that index is within 0-9
        if(references[index] != null)
            return references[index].toString();
        else
            return "";//no reference for that index
    }
}

虽然解决方案2更像是这样:

class SomeObject{
    ArrayList<OtherObject> references = new ArrayList<>(0);
    int[] pointers = new int[10];
    {
        for(int i = 0; i<10; i++){
            if(i != 3 && i != 8){
                pointers[i] = references.size();
                references.add(new OtherObject());
            }else{
                pointers[i] = -1;//no reference available
            }
        }
    }

    //then to use (here getting the toString() value)
    String getStringOfObjectAtIndex(int index){
        //in real code we'd first check that index is within 0-9
        if(pointers[index] != -1)
            return references.get(pointers[index]).toString();
        else
            return "";//no reference for that index
    }
}

tl; dr:是一个大于int的数组中的空引用吗?

1 个答案:

答案 0 :(得分:1)

在第一种情况下,假设参考成本为64位,则需要128位来存储两个空引用,并且代码易于理解和维护。

在第二种情况下,您需要一个10个整数的额外数组(这意味着10 * 32位,加上阵列本身至少16个字节),并且代码是复杂的。更不用说ArrayList本身与数组相比有额外的开销,并且无论如何都会包含一个大于8的数组来保存元素。

无论如何,这看起来很像过早优化,这是所有邪恶的根源。使用最简单,最明显,最易读和可维护的解决方案。它有很好的机会足够快,甚至有机会成为最快和最低的记忆。

如果您有一个非常大且非常稀疏的数组,那么备用策略可能会很有用。但在这种情况下,使用Map<Integer, OtherObject>会更简单。