0

我知道这可能很简单,我有一种情况需要在使用四个 for 循环(两个用于计数和删除空元素,两个用于添加元素)合并两个 String 数组或使用两个带有 ArrayList 的 for 循环之间做出决定并使用 ArrayList.toArray() 将 ArrayList 转换为数组。

在性能方面,这两种方法有什么区别吗?

编辑

由于兼容性问题,我不得不放弃使用泛型方法的 ArrayList。但这是较早的代码。

List<String> newList = new ArrayList<String>();

    for (String element : array1)
    {
      if (element != null)
      {
        newList.add(element);
      }
    }

    for (String element : array2)
    {
      if (element != null)
      {
        newList.add(element);
      }
    }

    return newList.toArray(new String[]{});

我用一个循环编写了一个新代码,但我想我可能会在精神上杀死下一个阅读此代码的人。

String[] newArr = new String[array1.length + array2.length];
int n = 0;

for (int i = 0; i < newArr.length; i++)
{
  if (i < array1.length && array1[i] != null)
  {
    newArr[n] = array1[i];
    n++;
  }

  if (i >= array1.length)
  {
    int a = 0;
    if (array1.length < array2.length)
    {
      a = (i - array1.length) + (array2.length - array1.length);
    }
    else
    {
      a = i - array1.length;
    }

    if (array2[a] != null)
    {
      newArr[n] = array2[a];
      n++;
    }
  }
}

return newArr;

最后知道不需要空元素检查,所以继续使用这个简单的代码。

String[] newArr = new String[array1.length + array2.length];

    System.arraycopy(array1, 0, newArr, 0, array1.length);
    System.arraycopy(array2, 0, newArr, array1.length, array2.length);

    return newArr;

我从下面的讨论中猜想第二种方法性能更好。

4

3 回答 3

3

假设 1 个 for 循环具有 O(n) 时间复杂度,4 个 for 循环和 2 个 for 循环将具有相同的时间复杂度

4*O(n) = O(n)
2*O(n) = O(n)

但是使用数组而不是 ArrayLists 会占用更少的内存。所以选择第一个选择。

于 2013-10-16T12:37:49.270 回答
0

尽量避免循环,因为每次 u 循环使用n元素时,时间和空间复杂度都会增加n.

请粘贴您的代码。

于 2013-10-16T12:36:51.300 回答
0

与第二个选项一样,将保存对集合的 2 次迭代,如果列表中的对象数量很高,这肯定会提高性能。

于 2013-10-16T12:37:08.457 回答