Java 在数组中的未指定索引处存储值。什么';快一点?

Java 在数组中的未指定索引处存储值。什么';快一点?,java,arrays,arraylist,Java,Arrays,Arraylist,假设我想向数组中添加一个值,但无论在何处,只要该索引中的当前项为空。此空值可以是数组中任意位置的任意位置。我只想拥有我的价值 在我的阵列中的某个地方。我是否应该像这样迭代它: for (int i = 0; i < 64; i++) { if (items[i] == null) { items[i] = obj; return; } for(int i=0;i0) { int index=this.

假设我想向数组中添加一个值,但无论在何处,只要该索引中的当前项为空。此空值可以是数组中任意位置的任意位置。我只想拥有我的价值 在我的阵列中的某个地方。我是否应该像这样迭代它:

    for (int i = 0; i < 64; i++) {
        if (items[i] == null) {
            items[i] = obj;
            return;
        }
for(int i=0;i<64;i++){
如果(项目[i]==null){
项目[i]=obj;
返回;
}
这样,它可能必须在找到一个空点之前遍历很多元素。使用另一种类型,即ArrayList,会更快吗


这是一个游戏,所以性能非常重要,每秒可能要执行300次(同时访问和删除项目).那么对于一个游戏,我应该用什么来存储项目和进行迭代呢?

我过去使用的一种方法是使用数组和队列。每当你向数组中添加对象时,你都会首先检查队列是否有空的插槽。每当你销毁一个对象时,你都会将数组插槽设置为null,并将索引添加到队列中,这样你就可以在我的测试中,这比列表要快,因为只有当数组变大时,你才能调整它的大小

代码方面

Queue<int> emptySlots;
Object[] arrayOfStuff;

public void AddStuff(object stuffToAdd)
{
    if (this.emptySlots.Count > 0)
    {
        int index = this.emptySlots.Dequeue();
        //make sure your objects know their position in the array
        stuffToAdd.ID = index;
        this.arrayOfStuff[index] = stuffToAdd;            
    }
    else
    {
        //resize array and add new object to end rememebering to fetch its id
    }
}

public void RemoveStuff(object stuffToRemove)
{
    this.emptySlots.Enqueue(stuffToRemove.ID);
    this.arrayOfStuff[stuffToRemove.ID] = null;
}
队列空区;
对象[]arrayOfStuff;
public void AddStuff(object stuff to add)
{
如果(this.emptySlots.Count>0)
{
int index=this.emptySlots.Dequeue();
//确保对象知道它们在阵列中的位置
stuffToAdd.ID=索引;
this.arrayOfStuff[索引]=要添加的内容;
}
其他的
{
//调整数组大小并添加新对象以结束RemeBering以获取其id
}
}
public void RemoveStuff(对象填充移动)
{
this.emptySlots.Enqueue(stufptoremove.ID);
this.arrayOfStuff[Stufptoremove.ID]=null;
}

我过去使用的一种方法是使用数组和队列。每当向数组中添加对象时,首先检查队列中是否有空插槽。每当销毁对象时,都会将数组插槽设置为null,并将索引添加到队列中,以便稍后可以快速将其拉出。在我的测试中,这比Li更快st,因为只有当数组变大时才调整其大小

代码方面

Queue<int> emptySlots;
Object[] arrayOfStuff;

public void AddStuff(object stuffToAdd)
{
    if (this.emptySlots.Count > 0)
    {
        int index = this.emptySlots.Dequeue();
        //make sure your objects know their position in the array
        stuffToAdd.ID = index;
        this.arrayOfStuff[index] = stuffToAdd;            
    }
    else
    {
        //resize array and add new object to end rememebering to fetch its id
    }
}

public void RemoveStuff(object stuffToRemove)
{
    this.emptySlots.Enqueue(stuffToRemove.ID);
    this.arrayOfStuff[stuffToRemove.ID] = null;
}
队列空区;
对象[]arrayOfStuff;
public void AddStuff(object stuff to add)
{
如果(this.emptySlots.Count>0)
{
int index=this.emptySlots.Dequeue();
//确保对象知道它们在阵列中的位置
stuffToAdd.ID=索引;
this.arrayOfStuff[索引]=要添加的内容;
}
其他的
{
//调整数组大小并添加新对象以结束RemeBering以获取其id
}
}
public void RemoveStuff(对象填充移动)
{
this.emptySlots.Enqueue(stufptoremove.ID);
this.arrayOfStuff[Stufptoremove.ID]=null;
}

您可以使用众多的实现以多种不同的方式重构这项工作,但您需要它吗?这是必要的吗?这会提高您的性能吗?您是否有实时约束(满足期限要求)?这几行代码是您的瓶颈吗?您的数组有64个框,可以调整大小吗?数组末尾的项在开始时大多为空吗?您需要线程安全吗?您是否运行了压力/负载测试并测量了您在这些行中花费的时间(平均、最低和最高)

您可以进行许多优化,但它们取决于应用程序的行为


也许您可以稍微重新考虑一下您的程序,以提高性能。在我看来,它通常是最有效的。您是否想过用其他方法替换阵列?您可以自己实现(轻量级)接口,以管理相关的(非空)项目。如果您依赖于数组中的位置,那么您可以将该信息添加到项目中(我假设这些是对象)。

您可以使用大量的实现以多种不同的方式重构该工作,但您需要它吗?这有必要吗?这会提高您的性能吗?您有实时约束吗(满足截止日期)?这几行代码是您的瓶颈吗?您的数组有64个框,可以调整大小吗?数组末尾的项在开始时大多为空吗?您需要线程安全吗?您是否运行了压力/负载测试并测量了您在这些行中花费的时间(平均、最低和最高)

您可以进行许多优化,但它们取决于应用程序的行为


也许您可以稍微重新考虑一下您的程序,以提高性能。在我看来,它通常是最有效的。您是否想过用其他方法替换阵列?您可以自己实现(轻量级)接口,以管理相关的(非空)项目。如果您依赖于数组中的位置,则可以将该信息添加到项目中(我假设这些是对象)。

我不确定您在做什么,但尝试队列或列表如何检索项目?您需要随机访问它们吗(听起来像这样)或者,你只是重复一下。你也可以考虑一个映射或集合,这取决于你如何访问项目。你真的测试了一些标准java集合的性能吗?在你测量它之前,没有什么可能会影响性能的问题…我只是反复迭代,然后使用它。我不确定你在做什么。不要尝试队列或列表如何检索项目?是否需要随机访问它们(听起来像这样)或者,你只是重复了一遍。你也可以考虑一个映射或集合,这取决于你如何访问项目。你真的测试了一些标准java集合的性能吗?在测量之前,没有什么可能影响性能的问题…我只是反复迭代,然后使用它。你可能需要修改代码A。比特,我以为这是一个C#问题,我很确定队列是一个国米