【问题标题】:Build a String with one thousand 'A' Characters [duplicate]用一千个“A”字符构建一个字符串[重复]
【发布时间】:2020-09-09 18:13:48
【问题描述】:

我有一个关于优化的简单问题。 假设我有一个函数应该返回一个包含一千个“A”字符的字符串(这个数字是任意的,以后可能会被参数化)。这样做的最佳方式是什么?

StringBuilder sb = new StringBuilder();
for(int i=0; i<1000; i++)
   sb.append('A');
return sb.toString();

我使用 StringBuilder 提出了这个解决方案,但我觉得应该有更好的解决方案,比如 memcpy。

谢谢!

【问题讨论】:

标签: java string optimization stringbuilder


【解决方案1】:

Arrays::fill

演示:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        char[] arr = new char[1000];
        Arrays.fill(arr, 'A');
        String str = new String(arr);
        System.out.println(str);
    }
}

或者,String::repeat

演示:

public class Main {
    public static void main(String[] args) {
        String str = "A".repeat(1000);
        System.out.println(str);
    }
}

【讨论】:

  • 如果填充字符是 ASCII 字符,我建议使用 byte 数组而不是 char 数组,然后调用 new String( arr, charset ) 并将 charset 设置为ASCII。但是只有一个实验才能证明我的方法是否真的比你的更快(并且仍然比String.repeat() 更快)。
【解决方案2】:

我认为您可以使用字节数组来完成,并将其转换为字符串,因为您已经知道大小。

byte[] arr = new byte[1000];
for  (int i = 0; i < arr.length; i ++) arr[i] = 65;
String str = new String(arr);

如果纯字节不适合您,那么您可以使用char[]。如果您需要更多,您可以将大小乘以 2 或每个字符所需的代码点数,然后再次使用 for 循环(但跳过您的字母占用的代码点数)

【讨论】:

  • 您的方法在我的机器上花费了 31 秒来完成 10_000_000 次迭代。 String.repeat() 耗时 4 秒。
猜你喜欢
  • 2020-10-31
  • 2017-11-09
  • 2018-10-15
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多