在Java中,我需要在编译时构造一个未知的n零字符串。n理想情况下我会使用
String s = new String('0', n);
但这样的构造函数不存在。CharSequence似乎也没有合适的构造函数。所以我很想使用 构建自己的循环StringBuilder。
在我冒着被老板抛弃的风险这样做之前,有人可以建议一下:Java 中有这样做的标准方法吗?在 C++ 中,构造函数之一std::string允许这样做。
如果您不介意创建额外的字符串:
\n\nString zeros = new String(new char[n]).replace((char) 0, '0');\nRun Code Online (Sandbox Code Playgroud)\n\n或者更明确(并且可能更有效):
\n\nchar[] c = new char[n];\nArrays.fill(c, '0');\nString zeros = new String(c);\nRun Code Online (Sandbox Code Playgroud)\n\n性能方面,该Arrays.fill选项在大多数情况下似乎表现更好,尤其是对于大字符串。对于大字符串使用 aStringBuilder相当慢,但对于小字符串则有效。使用的replace是一种很好的单衬,对于较大的字符串表现良好,但效果不佳filll。
不同 n 值的微观基准:
\n\nBenchmark (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\nRun Code Online (Sandbox Code Playgroud)\n