假设您在对象中有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的数组中的空引用吗?
答案 0 :(得分:1)
在第一种情况下,假设参考成本为64位,则需要128位来存储两个空引用,并且代码易于理解和维护。
在第二种情况下,您需要一个10个整数的额外数组(这意味着10 * 32位,加上阵列本身至少16个字节),并且代码是复杂的。更不用说ArrayList本身与数组相比有额外的开销,并且无论如何都会包含一个大于8的数组来保存元素。
无论如何,这看起来很像过早优化,这是所有邪恶的根源。使用最简单,最明显,最易读和可维护的解决方案。它有很好的机会足够快,甚至有机会成为最快和最低的记忆。
如果您有一个非常大且非常稀疏的数组,那么备用策略可能会很有用。但在这种情况下,使用Map<Integer, OtherObject>
会更简单。