168

java中有没有一种方法可以创建具有指定字符数的字符串?就我而言,我需要创建一个包含 10 个空格的字符串。我目前的代码是:

StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
   outputBuffer.append(" ");
}
return outputBuffer.toString();

有没有更好的方法来完成同样的事情。特别是我想要一些快速的东西(在执行方面)。

4

27 回答 27

182

可能是使用 API 的最短代码String,专门:

String space10 = new String(new char[10]).replace('\0', ' ');

System.out.println("[" + space10 + "]");
// prints "[          ]"

作为一种方法,无需直接实例化char

import java.nio.CharBuffer;

/**
 * Creates a string of spaces that is 'spaces' spaces long.
 *
 * @param spaces The number of spaces to add to the string.
 */
public String spaces( int spaces ) {
  return CharBuffer.allocate( spaces ).toString().replace( '\0', ' ' );
}

调用使用:

System.out.printf( "[%s]%n", spaces( 10 ) );
于 2010-05-11T02:35:15.350 回答
80

我强烈建议不要手动编写循环。在您的编程生涯中,您将一遍又一遍地这样做。阅读你的代码的人——包括你——总是需要花费时间来消化循环的含义,即使只有几秒钟。

而是重用StringUtils.repeat提供代码的可用库之一,就像Apache Commons Lang一样:

StringUtils.repeat(' ', length);

这样你也不必担心性能,因此所有的血腥细节StringBuilder,编译器优化等都被隐藏了。如果该函数结果很慢,那将是库的错误。

使用Java 11,它变得更加容易:

" ".repeat(length);
于 2014-07-30T20:51:47.430 回答
71

嗯,现在我想起来了,也许Arrays.fill

char[] charArray = new char[length];
Arrays.fill(charArray, ' ');
String str = new String(charArray);

当然,我假设该fill方法与您的代码执行相同的操作,因此它的执行可能大致相同,但至少行数更少。

于 2010-05-10T17:26:45.093 回答
40

for 循环将由编译器进行优化。在像您这样的情况下,您不需要自己关心优化。相信编译器。

顺便说一句,如果有一种方法可以创建一个包含 n 个空格字符的字符串,那么它的编码方式与您刚才所做的相同。

于 2010-05-10T17:25:11.930 回答
39

Java 11开始:

" ".repeat(10);

Java 8开始:

generate(() -> " ").limit(10).collect(joining());

在哪里:

import static java.util.stream.Collectors.joining;
import static java.util.stream.Stream.generate;
于 2019-08-15T18:42:40.447 回答
30

在 Java 8 中,您可以使用String.join

String.join("", Collections.nCopies(n, s));
于 2017-03-25T02:40:51.493 回答
13

如果您只想要空格,那么如何:

String spaces = (n==0)?"":String.format("%"+n+"s", "");

这将导致 abs(n) 空格;

于 2012-08-15T10:37:19.803 回答
12

从 Java 11 开始,您可以简单地使用它String.repeat(count)来解决您的问题。

返回一个字符串,其值为该字符串重复count次数的串联。

如果此字符串为空或count为零,则返回空字符串。

因此,您的代码将如下所示,而不是循环:

" ".repeat(length);
于 2019-06-07T10:12:29.527 回答
8

我认为这是可能的代码更少,它使用 Guava Joiner 类:

Joiner .on("").join( Collections.nCopies (10, " "));

于 2014-02-13T17:41:55.600 回答
8

您可以使用标准String.format函数生成 N 个空格。例如:

String.format("%5c", ' ');

创建一个有 5 个空格的字符串。

或者

int count = 15;
String fifteenSpacebars = String.format("%" + count + "c", ' ');

制作一串 15 个空格键。

如果要重复另一个符号,则必须用所需符号替换空格:

int count = 7;
char mySymbol = '#';
System.out.println(String.format("%" + count + "c", ' ').replaceAll("\\ ", "\\" + mySymbol));

输出:

#######
于 2018-07-25T22:28:21.907 回答
6

我的贡献基于快速求幂算法。

/**
 * Repeats the given {@link String} n times.
 * 
 * @param str
 *            the {@link String} to repeat.
 * @param n
 *            the repetition count.
 * @throws IllegalArgumentException
 *             when the given repetition count is smaller than zero.
 * @return the given {@link String} repeated n times.
 */
public static String repeat(String str, int n) {
    if (n < 0)
        throw new IllegalArgumentException(
                "the given repetition count is smaller than zero!");
    else if (n == 0)
        return "";
    else if (n == 1)
        return str;
    else if (n % 2 == 0) {
        String s = repeat(str, n / 2);
        return s.concat(s);
    } else
        return str.concat(repeat(str, n - 1));
}

我针对其他两种方法测试了该算法:

  • String.concat()用于连接字符串的常规 for 循环
  • 使用 a 的常规 for 循环StringBuilder

测试代码(使用 for 循环连接并且String.concat()对于 large 变得很慢n,所以我在第 5 次迭代后将其省略了)。

/**
 * Test the string concatenation operation.
 * 
 * @param args
 */
public static void main(String[] args) {
    long startTime;
    String str = " ";

    int n = 1;
    for (int j = 0; j < 9; ++j) {
        n *= 10;
        System.out.format("Performing test with n=%d\n", n);

        startTime = System.currentTimeMillis();
        StringUtil.repeat(str, n);
        System.out
                .format("\tStringUtil.repeat() concatenation performed in    %d milliseconds\n",
                        System.currentTimeMillis() - startTime);

        if (j <5) {
            startTime = System.currentTimeMillis();
            String string = "";
            for (int i = 0; i < n; ++i)
                string = string.concat(str);
            System.out
                    .format("\tString.concat() concatenation performed in        %d milliseconds\n",
                            System.currentTimeMillis() - startTime);
        } else
            System.out
                    .format("\tString.concat() concatenation performed in        x milliseconds\n");
        startTime = System.currentTimeMillis();
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < n; ++i)
            b.append(str);
        b.toString();
        System.out
                .format("\tStringBuilder.append() concatenation performed in %d milliseconds\n",
                        System.currentTimeMillis() - startTime);
    }
}

结果:

Performing test with n=10
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        0 milliseconds
    StringBuilder.append() concatenation performed in 0 milliseconds
Performing test with n=100
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        1 milliseconds
    StringBuilder.append() concatenation performed in 0 milliseconds
Performing test with n=1000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        1 milliseconds
    StringBuilder.append() concatenation performed in 1 milliseconds
Performing test with n=10000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        43 milliseconds
    StringBuilder.append() concatenation performed in 5 milliseconds
Performing test with n=100000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        1579 milliseconds
    StringBuilder.append() concatenation performed in 1 milliseconds
Performing test with n=1000000
    StringUtil.repeat() concatenation performed in    0 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 10 milliseconds
Performing test with n=10000000
    StringUtil.repeat() concatenation performed in    7 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 112 milliseconds
Performing test with n=100000000
    StringUtil.repeat() concatenation performed in    80 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 1107 milliseconds
Performing test with n=1000000000
    StringUtil.repeat() concatenation performed in    1372 milliseconds
    String.concat() concatenation performed in        x milliseconds
    StringBuilder.append() concatenation performed in 12125 milliseconds

结论:

  • 对于大型n- 使用递归方法
  • for small n- for 循环有足够的速度
于 2015-01-06T10:23:22.123 回答
4

这个怎么样?

char[] bytes = new char[length];
Arrays.fill(bytes, ' ');
String str = new String(bytes);
于 2010-05-10T18:31:06.377 回答
4

考虑到我们有:

String c = "c"; // character to repeat, for empty it would be " ";
int n = 4; // number of times to repeat
String EMPTY_STRING = ""; // empty string (can be put in utility class)

Java 8(使用流)

String resultOne = IntStream.range(0,n)
   .mapToObj(i->c).collect(Collectors.joining(EMPTY_STRING)); // cccc

Java 8(使用 nCopies)

String resultTwo = String.join(EMPTY_STRING, Collections.nCopies(n, c)); //cccc
于 2018-08-20T07:17:34.457 回答
2

RandomStringUtils可以根据给定的输入大小创建字符串。不能评论速度,但它是一个班轮。

RandomStringUtils.random(5,"\t");

创建一个输出

\t\t\t\t\t

如果您不想在代码中看到\0 ,则更可取。

于 2016-05-02T08:07:30.967 回答
2

使用 StringUtils: StringUtils.repeat(' ', 10)

于 2019-02-07T16:06:37.507 回答
2

Guava 的最短解决方案:

Strings.repeat(" ", len)

通过简单的方法在 java 中重复一个字符串

于 2019-09-08T13:48:34.337 回答
2

这对我来说没有在 Java 8 中使用任何外部库

String sampleText = "test"
int n = 3;
String output = String.join("", Collections.nCopies(n, sampleText));
System.out.println(output);

输出是

testtesttest
于 2020-01-04T14:48:44.297 回答
2

诠释 c = 10; 字符串空格 = String.format("%" +c+ "c", ' '); 这将解决您的问题。

于 2020-01-04T15:14:55.377 回答
1

在大多数情况下,您只需要达到一定长度的字符串,比如 100 个空格。您可以准备一个字符串数组,其中索引号等于空格填充字符串的大小并查找字符串,如果所需的长度在限制范围内,或者如果它在边界之外,则按需创建它。

于 2010-05-10T18:15:51.637 回答
1

为了获得良好的性能,结合来自aznilamirFrustratedWithFormsDesigner的答案

private static final String BLANKS = "                       ";
private static String getBlankLine( int length )
{
    if( length <= BLANKS.length() )
    {
        return BLANKS.substring( 0, length );
    }
    else
    {
        char[] array = new char[ length ];
        Arrays.fill( array, ' ' );
        return new String( array );
    }
}

BLANKS根据您的要求调整大小。我的特定BLANKS字符串长度约为 200 个字符。

于 2014-04-25T16:52:38.743 回答
0

只需用 StringBuilder 替换您的StringBuffer。很难打败它。

如果您的长度很大,您可能会实现一些更有效(但更笨拙)的自附加,在每次迭代中复制长度:

 public static String dummyString(char c, int len) {
  if( len < 1 ) return "";
  StringBuilder sb = new StringBuilder(len).append(c);
  int remnant = len - sb.length();
  while(remnant  > 0) {
   if( remnant  >= sb.length() ) sb.append(sb);
   else sb.append(sb.subSequence(0, remnant));
   remnant  = len - sb.length();
  }
  return sb.toString();
 }

另外,您可以尝试这种Arrays.fill()方法(FrustratedWithFormsDesigner的答案)。

于 2010-05-10T17:39:11.670 回答
0

您可以替换StringBufferStringBuilder(后者不同步,在单线程应用程序中可能更快)

您可以创建StringBuilder一次实例,而不是每次需要时都创建它。

像这样的东西:

class BuildString {
     private final StringBuilder builder = new StringBuilder();
     public String stringOf( char c , int times ) {

         for( int i = 0 ; i < times ; i++  ) {
             builder.append( c );
         }
         String result = builder.toString();
         builder.delete( 0 , builder.length() -1 );
         return result;
      }

  }

并像这样使用它:

 BuildString createA = new BuildString();
 String empty = createA.stringOf( ' ', 10 );

如果您将您的createA作为实例变量,您可以节省创建实例的时间。

这不是线程安全的,如果你有多个线程,每个线程都应该有自己的副本。

于 2010-05-10T17:48:07.773 回答
0

有这样的方法。这会在给定的末尾附加所需的空格,String以使给定String的长度为特定长度。

public static String fillSpaces (String str) {

    // the spaces string should contain spaces exceeding the max needed
    String spaces = "                                                   ";
    return str + spaces.substring(str.length());
}
于 2014-08-08T19:42:41.157 回答
0

希望字符串具有固定大小,因此您可以填充或截断,以制表数据...

class Playground {
    private static String fixStrSize(String s, int n) {
        return String.format("%-" + n + "s", String.format("%." + n +"s", s));
    }

    public static void main(String[ ] args) {
        System.out.println("|"+fixStrSize("Hell",8)+"|");
        System.out.println("|"+fixStrSize("Hells Bells Java Smells",8)+"|");
    }
}

|Hell    |
|Hells Be|

这里有很好的参考。

于 2020-01-02T21:23:23.393 回答
-1

也可以使用如下简单的方法

public static String padString(String str, int leng,char chr) {
        for (int i = str.length(); i <= leng; i++)
            str += chr;
        return str;
    }
于 2013-03-21T18:11:21.383 回答
-2

这个怎么样?

public String fillSpaces(int len) {
    /* the spaces string should contain spaces exceeding the max needed */  
    String spaces = "                                                   ";
    return spaces.substring(0,len);
}

编辑:我编写了一个简单的代码来测试这个概念以及我发现的内容。

方法1:在循环中添加单个空格:

  public String execLoopSingleSpace(int len){
    StringBuilder sb = new StringBuilder();

    for(int i=0; i < len; i++) {
        sb.append(' ');
    }

    return sb.toString();
  }

方法2:追加100个空格并循环,然后是子串:

  public String execLoopHundredSpaces(int len){
    StringBuilder sb = new StringBuilder("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ");

    for (int i=0; i < len/100 ; i++) {
        sb.append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ");
    }

    return sb.toString().substring(0,len);
  }

结果我创建了 12,345,678 个空格:

C:\docs\Projects> java FillSpace 12345678
method 1: append single spaces for 12345678 times. Time taken is **234ms**. Length of String is 12345678
method 2: append 100 spaces for 123456 times. Time taken is **141ms**. Length of String is 12345678
Process java exited with code 0

对于 10,000,000 个空格:

C:\docs\Projects> java FillSpace 10000000
method 1: append single spaces for 10000000 times. Time taken is **157ms**. Length of String is 10000000
method 2: append 100 spaces for 100000 times. Time taken is **109ms**. Length of String is 10000000
Process java exited with code 0

结合直接分配和迭代总是花费更少的时间,在创建巨大空间时平均减少 60 毫秒。对于较小的尺寸,这两个结果都可以忽略不计。

但请继续评论:-)

于 2012-04-03T08:34:44.257 回答
-3

我知道您所询问的内容没有内置方法。但是,对于像 10 这样的小固定长度,您的方法应该足够快。

于 2010-05-10T17:25:44.130 回答