可能重复
问题是How to convert Vector to String array in java
哪一个是将向量值存储到String数组的最佳性能。它将如何在后台执行?
Vector<String> v = new Vector<String>();
// this one
String s[] = v.toArray(new String[v.size()]);
// or this one
String s[] = v.toArray(new String[0]);
答案 0 :(得分:2)
作为一般经验法则,第一次正确调整数组或集合的大小会更快,因为它可以防止需要稍后调整一次或多次。减少工作量= =更快。顺便说一下,你几乎肯定不应该使用Vector
;在绝大多数情况下,ArrayList
是更好的选择。
更新:对于您的特定情况,结果将严重依赖于Vector
中的数据。与任何有关性能的问题一样,您应该自己进行分析。既然您已经说过不知道如何进行基准测试,我建议您阅读Java应用程序的性能分析和性能测量。如果你没有测量东西,你不应该浪费时间担心标准库操作的性能。您可能会担心与应用程序中的实际瓶颈无关的事情。
答案 1 :(得分:2)
我原本期望new String[list.size()]
最快,但这似乎会导致Vector的额外锁定,使其变慢。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
public class Main {
private static final String[] NO_STRINGS = {};
private static final int runs = 50000000;
public static void main(String... args) {
List<String> strings = Arrays.asList("one,two,three,four,five,six".split(","));
List<String> arrayList = new ArrayList<String>(strings);
Vector<String> vector = new Vector<String>(strings);
testNoStrings(arrayList);
testStrings0(arrayList);
testSize(arrayList);
testNoStrings(vector);
testStrings0(vector);
testSize(vector);
}
private static String[] testSize(List<String> list) {
String[] ret = null;
long start = System.nanoTime();
for (int i = 0; i < runs; i++)
ret = list.toArray(new String[list.size()]);
long time = System.nanoTime() - start;
System.out.printf(list.getClass().getSimpleName() + " Using new String[list.size()] took an average of %,d ns%n", time / runs);
return ret;
}
private static String[] testNoStrings(List<String> list) {
String[] ret = null;
long start = System.nanoTime();
for (int i = 0; i < runs; i++)
ret = list.toArray(NO_STRINGS);
long time = System.nanoTime() - start;
System.out.printf(list.getClass().getSimpleName() + " Using NO_STRINGS took an average of %,d ns%n", time / runs);
return ret;
}
private static String[] testStrings0(List<String> list) {
String[] ret = null;
long start = System.nanoTime();
for (int i = 0; i < runs; i++)
ret = list.toArray(new String[0]);
long time = System.nanoTime() - start;
System.out.printf(list.getClass().getSimpleName() + " Using new String[0] took an average of %,d ns%n", time / runs);
return ret;
}
}
您看到的任何差异很可能与机器有关,但一个明显的因素是ArrayList比Vector快。
ArrayList Using NO_STRINGS took an average of 17 ns
ArrayList Using new String[0] took an average of 22 ns
ArrayList Using new String[list.size()] took an average of 27 ns
Vector Using NO_STRINGS took an average of 28 ns
Vector Using new String[0] took an average of 29 ns
Vector Using new String[list.size()] took an average of 46 ns