在 Java 中,我需要构造一个由 n
个零组成的字符串,其中 n
在编译时未知。理想情况下我会使用
String s = new String('0', n);
但是不存在这样的构造函数。 CharSequence
似乎也没有合适的构造函数。因此,我很想使用 StringBuilder
构建自己的循环。
在我冒着被老板抛弃的风险这样做之前,有人可以建议一下:Java 中有没有一种标准的方法可以做到这一点?在 C++ 中,std::string 构造函数之一允许这样做。
最佳答案
如果您不介意创建额外的字符串:
String zeros = new String(new char[n]).replace((char) 0, '0');
或者更明确(并且可能更有效):
char[] c = new char[n];
Arrays.fill(c, '0');
String zeros = new String(c);
<小时/>
就性能而言,Arrays.fill
选项在大多数情况下似乎表现更好,尤其是对于大字符串。使用 StringBuilder
对于大字符串来说相当慢,但对于小字符串来说却很有效。使用 replace
是一种很好的单行代码,对于较大的字符串执行效果不错,但不如 filll
。
不同 n 值的微基准:
Benchmark (n) Mode Samples Score Error Units
c.a.p.SO26504151.builder 1 avgt 3 29.452 ± 1.849 ns/op
c.a.p.SO26504151.builder 10 avgt 3 51.641 ± 12.426 ns/op
c.a.p.SO26504151.builder 1000 avgt 3 2681.956 ± 336.353 ns/op
c.a.p.SO26504151.builder 1000000 avgt 3 3522995.218 ± 422579.979 ns/op
c.a.p.SO26504151.fill 1 avgt 3 30.255 ± 0.297 ns/op
c.a.p.SO26504151.fill 10 avgt 3 32.638 ± 7.553 ns/op
c.a.p.SO26504151.fill 1000 avgt 3 592.459 ± 91.413 ns/op
c.a.p.SO26504151.fill 1000000 avgt 3 706187.003 ± 152774.601 ns/op
c.a.p.SO26504151.replace 1 avgt 3 44.366 ± 5.153 ns/op
c.a.p.SO26504151.replace 10 avgt 3 51.778 ± 2.959 ns/op
c.a.p.SO26504151.replace 1000 avgt 3 1385.383 ± 289.319 ns/op
c.a.p.SO26504151.replace 1000000 avgt 3 1486335.886 ± 1807239.775 ns/op
关于java - 从重复的字符构造字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504151/