从重复的字符构造字符串

P45*_*ent 1 java string

在Java中,我需要在编译时构造一个未知的n零字符串。n理想情况下我会使用

String s = new String('0', n);

但这样的构造函数不存在。CharSequence似乎也没有合适的构造函数。所以我很想使用 构建自己的循环StringBuilder

在我冒着被老板抛弃的风险这样做之前,有人可以建议一下:Java 中有这样做的标准方法吗?在 C++ 中,构造函数之一std::string允许这样做。

ass*_*ias 5

如果您不介意创建额外的字符串:

\n\n
String zeros = new String(new char[n]).replace((char) 0, '0');\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者更明确(并且可能更有效):

\n\n
char[] c = new char[n];\nArrays.fill(c, '0');\nString zeros = new String(c);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

性能方面,该Arrays.fill选项在大多数情况下似乎表现更好,尤其是对于大字符串。对于大字符串使用 aStringBuilder相当慢,但对于小字符串则有效。使用的replace是一种很好的单衬,对于较大的字符串表现良好,但效果不佳filll

\n\n

不同 n 值的微观基准:

\n\n
Benchmark                       (n)  Mode  Samples        Score         Error  Units\nc.a.p.SO26504151.builder          1  avgt        3       29.452 \xc2\xb1       1.849  ns/op\nc.a.p.SO26504151.builder         10  avgt        3       51.641 \xc2\xb1      12.426  ns/op\nc.a.p.SO26504151.builder       1000  avgt        3     2681.956 \xc2\xb1     336.353  ns/op\nc.a.p.SO26504151.builder    1000000  avgt        3  3522995.218 \xc2\xb1  422579.979  ns/op\nc.a.p.SO26504151.fill             1  avgt        3       30.255 \xc2\xb1       0.297  ns/op\nc.a.p.SO26504151.fill            10  avgt        3       32.638 \xc2\xb1       7.553  ns/op\nc.a.p.SO26504151.fill          1000  avgt        3      592.459 \xc2\xb1      91.413  ns/op\nc.a.p.SO26504151.fill       1000000  avgt        3   706187.003 \xc2\xb1  152774.601  ns/op\nc.a.p.SO26504151.replace          1  avgt        3       44.366 \xc2\xb1       5.153  ns/op\nc.a.p.SO26504151.replace         10  avgt        3       51.778 \xc2\xb1       2.959  ns/op\nc.a.p.SO26504151.replace       1000  avgt        3     1385.383 \xc2\xb1     289.319  ns/op\nc.a.p.SO26504151.replace    1000000  avgt        3  1486335.886 \xc2\xb1 1807239.775  ns/op\n
Run Code Online (Sandbox Code Playgroud)\n