【发布时间】:2013-10-24 13:47:42
【问题描述】:
我知道这可能很简单,我有一种情况需要在使用四个 for 循环(两个用于计数和删除空元素,两个用于添加元素)合并两个字符串数组或使用两个 for 循环之间做出决定使用 ArrayList 并使用 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;
从下面的讨论中我猜想第二种方法性能更好。
【问题讨论】:
-
你能粘贴你的代码吗?
-
您可能需要考虑使用 LinkedList,除非您事先知道数组的大小。
-
@SimonAndréForsberg 是的,但这并不是那么糟糕。将项目添加到 ArrayList 仍然是 O(1) 摊销时间,更重要的是,它在实践中很快。在实践中,我几乎从未发现 LinkedList 更快,尤其是在这种情况下,您只追加到末尾然后迭代项目。因此,请务必尝试以确保它确实是一种改进。
-
@Chamilla:所以,你不愿意对自己的代码进行基准测试,你认为我们会为你做这件事吗?
-
这个问题似乎是题外话,因为它是关于众包基准测试工作。这个问题太本地化了,对任何人都没有多大用处。
标签: java performance for-loop arraylist