gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:10:22 25 4
gpt4 key购买 nike

假设一个对象中有 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 的数组内是否存在空引用?

最佳答案

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

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

无论如何,这看起来很像过早优化,这是万恶之源。使用最简单、最明显、最具可读性和可维护性的解决方案。它很有可能足够快,甚至有可能成为最快且占用内存最少的。

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

关于java - 对象数组与索引列表+数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com