将值存储在Array中未指定的索引处。什么更快?

时间:2012-03-02 21:50:43

标签: java arrays arraylist

假设我想为数组添加一个值,但只要该索引处的当前项为null,它就无所谓。这个null可以在数组中的任何位置,随机位置。我只想拥有自己的价值 我的数组中的某处。我应该像这样迭代它:

    for (int i = 0; i < 64; i++) {
        if (items[i] == null) {
            items[i] = obj;
            return;
        }

这样它可能必须在找到空点之前迭代很多元素。使用其他类型,即ArrayList会更快吗?

这适用于游戏,因此性能非常糟糕,每秒可执行300次(也可以访问和删除项目)。所以对于游戏来说,我最应该用什么来存储项目,迭代?

2 个答案:

答案 0 :(得分:1)

我过去使用的一种方法是使用数组和队列。每次向阵列添加对象时,首先检查队列以查看是否有空插槽。无论何时销毁对象,都可以将数组槽设置为null,并将索引添加到队列中,以便以后快速将其拉出。在我的测试期间,这比List更快,因为如果你把它放大,你只会调整数组的大小。

代码明智

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;
}

答案 1 :(得分:0)

您可以使用众多Collection实现以多种不同方式重构该工作,但您需要它吗?这有必要吗?这会改善你的表现吗?你有实时约束(符合截止日期)吗?这几行代码是你的瓶颈吗?你的阵列有64个盒子,它可以调整大小吗?这些项目在开头的数组末尾是否为空?你需要线程安全吗?您是否进行过压力/负荷测试并测量您在这些线路上花费的时间(平均,最低和最高)?

您可以执行许多优化,但这些优化取决于应用程序的行为。

也许您可以稍微重新考虑一下您的计划以提高表现。 IMO通常是最有效的。您是否考虑过用其他东西替换阵列?您可以执行Queue接口的自己的实现(轻量级)来管理相关(非空)项。如果您依赖于数组中的位置,那么您可以在项目中添加该信息(我猜这些是对象)。