向量到字符串数组的性能更好

时间:2011-09-21 13:34:08

标签: java vector

可能重复

问题是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]);

2 个答案:

答案 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