【问题标题】:Best way to convert ArrayList of Character to String [duplicate]将字符的ArrayList转换为字符串的最佳方法[重复]
【发布时间】:2012-01-12 16:37:54
【问题描述】:

我想将字符的 ArrayList 转换为字符串。我读过类似Best way to convert an ArrayList to a string 的帖子,但我想要更简单的方法。

我试过了

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

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

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

【问题讨论】:

  • 你为什么不使用for循环的方法来迭代你的ArrayList并将每个字符附加到一个字符串?不够简单?

标签: java arrays string


【解决方案1】:

我只是运行了一些基准测试,因为我对最快的方法很感兴趣。 我运行了 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 来收集每个字符(Sean Owen 的回答)

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. 创建一个空字符串,然后 += 每个字符(Jonathan Grandi 的答案)

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();

【讨论】:

    【解决方案2】:

    是的,很遗憾,您必须进行迭代。

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

    【讨论】:

      【解决方案3】:

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

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

      这会遍历列表以追加每个字符。

      结果:

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

      【讨论】:

      • 这将在每次遍历循环时创建一个新的 String 对象。然后它将不得不对它们进行垃圾收集。因此,如果您关心性能,请不要使用此答案。
      • @David Knipe:好点 - 谢谢!该答案使用以下方法衡量“更简单的方法”:1.)解决方案中的字符数和 2.)程序员看到的对象数。就表现而言,肖恩·欧文的回应非常合适。
      【解决方案4】:

      试试番石榴:

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

      或commons-lang:

      StringUtils.join(chars, null);
      

      【讨论】:

        【解决方案5】:

        这很简单:

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

        【讨论】:

        • 可能希望将列表的长度添加为 StringBulder 构造函数中的初始容量。这样它就不需要在内部增长一个数组。出于同样的原因,下面的 adarshr 方法可能会更快。如果速度是一个问题,我会对这两种方法进行基准测试。
        猜你喜欢
        • 2017-11-08
        • 2010-10-10
        • 2019-10-24
        • 2014-06-21
        • 2018-05-28
        • 2015-08-27
        • 2017-04-10
        • 2012-01-15
        相关资源
        最近更新 更多