在Java中,我需要在编译时构造一个n
零的字符串,n
未知。理想情况下我会使用
String s = new String('0', n);
但是没有这样的构造函数。 CharSequence
似乎也没有合适的构造函数。因此,我很想使用StringBuilder
构建自己的循环。
在我这样做之前,冒着被老板弄错的风险,任何人都可以提出建议:在Java中有没有一种标准的方法可以做到这一点?在C ++中,std::string
构造函数之一允许这样做。
答案 0 :(得分:4)
如果您不介意创建额外的字符串:
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
答案 1 :(得分:0)
创建一个n
大小的char数组并将其转换为String:
char[] myZeroCharArray = new char[n];
for(int i = 0; i < n; i++) myZeroCharArray[i] = '0';
String myZeroString = new String(myZeroCharArray);
答案 2 :(得分:0)
参见Apache Commons Lang中的StringUtils
答案 3 :(得分:0)
没有标准的JDK方式,但Apache commons(几乎是一个事实上的标准)具有StringUtils.repeat()方法,例如:
String s = StringUtils.repeat('x', 5); // s = "xxxxx"
答案 4 :(得分:0)
或普通的旧字符串格式
int n = 10;
String s = String.format("%" + n + "s", "").replace(' ', '0');
System.out.println(s);