繁体   English   中英

将字符数组列表转换为字符串的最佳方法

[英]Best way to convert ArrayList of Character to String

我想将字符的 ArrayList 转换为字符串。 我读过类似的线程,例如将 ArrayList 转换为字符串的最佳方法,但我想要更简单的方法。

我试过这个

List<Character> chars = new ArrayList<Character>();
...
Character[] charArray = (Character[]) chars.toArray();
String output = new String(charArray); // error

但它不起作用,因为new String()构造函数只接受char[]作为参数。 我无法轻松地将charscharArray转换为char[]类型。

没有简单的方法吗? 或者,我是否必须迭代才能创建一个字符串?

这很简单:

StringBuilder result = new StringBuilder(chars.size());
for (Character c : chars) {
  result.append(c);
}
String output = result.toString();

是的,不幸的是,您必须进行迭代。

char[] cs = new char[chars.size()];

for(int i = 0; i < cs.length; i++) {
    cs[i] = chars.get(i);
}

String output = new String(cs);

一种简单的方法是将每个字符附加到一个字符串中:

String myString = "";
for (Character c : charList) {
    myString += c;
}

这将遍历列表以附加每个字符。

结果:

charList 的输出是: [a, b, c] myString 的输出是: abc

我只是运行了一些基准测试,因为我对最快的方式很感兴趣。 我运行了 4 种不同的方法,每种方法都运行了 1.000.000(100 万)次以进行良好测量。

边注:

  • ArrayList 填充了 2710 个字符,
  • 输入是一些随机的 JSON 字符串,我躺在那里,
  • 我的电脑不是最强的(CPU:AMD Phenom II X4 955 @3.20 GHz)。
  1. 转换为数组,然后转换为字符串(adarshr 的回答)

char[] cs = new char[chars.size()];
for(int x = 0; x < cs.length; x++){
    cs[x] = chars.get(x);
}
String output = new String(cs);

时间:7716056685 纳秒或 ~7.7 秒/索引:1


  1. 使用具有预定义大小的 StringBuilder 来收集每个字符(肖恩欧文的答案)

StringBuilder result = new StringBuilder(chars.size());
for(Character c : chars){
    result.append(c);
}
String output = result.toString();

时间:77324811970 纳秒或 ~77.3 秒/索引:~10


  1. 使用没有预定义大小的 StringBuilder 来收集每个字符

StringBuilder result = new StringBuilder();
for(Character c : chars){
    result.append(c);
}
String output = result.toString();

时间:87704351396 纳秒或 ~87.7 秒 / 索引:~11,34


  1. 创建一个空字符串并且只 += 每个字符(乔纳森格兰迪的答案)

String output = "";
for(int x = 0; x < cs.length; x++){
    output += chars.get(x);
}

时间:4387283410400 纳秒或 ~4387.3 秒 / 索引:~568,59

我实际上不得不缩小这个比例。 这个方法只运行了 10000 次,已经花了大约 43 秒,我只是将结果乘以 100 得到大约 1.000.000 次运行

结论:

使用“转换为数组,然后转换为字符串”方法......它很快......另一方面,我没想到 += 操作如此缓慢......

我如何测试:

final String jsonExample = new String("/* Random Json String here */");
final char[] charsARRAY = jsonExample.toCharArray();
final ArrayList<Character> chars = new ArrayList<Character>();
for(int i = 0; i < charsARRAY.length; i++){
    chars.add(charsARRAY[i]);
}
final long time1, time2;
final int amount = 1000000;

time1 = System.nanoTime();

for(int i = 0; i < amount; i++){
    // Test method here
}

time2 = System.nanoTime();

试试番石榴:

Joiner.on("").join(chars);

或公共语言:

StringUtils.join(chars, null);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM