Java 使用字符串替代StringBuilder?

Java 使用字符串替代StringBuilder?,java,string,Java,String,目前我有这个 public static String repeatLetters(int multiplier, String text) { StringBuilder repeat = new StringBuilder(); for (int i = 0; i < text.length(); i++) { for (int j = 0; j < multiplier; j++) { repeat.append(tex

目前我有这个

 public static String repeatLetters(int multiplier, String text)
{  
  StringBuilder repeat = new StringBuilder();

  for (int i = 0; i < text.length(); i++)
  {
     for (int j = 0; j < multiplier; j++)
     { 
        repeat.append(text.charAt(i));
     }
  }

  System.out.println("Letters Repeated:");
  System.out.println("-----------");
  System.out.println(repeat);
  System.out.println("--------------");

  return repeat.toString();
}
publicstaticstringrepeatLetters(整数乘数,字符串文本)
{  
StringBuilder repeat=新建StringBuilder();
对于(int i=0;i
我希望以这样一种方式进行编码,使当前读取“return repeat.toString();”的最后一条语句只返回“return value”。我如何构造这段代码来做到这一点?有没有一种方法不使用StringBuilder,只使用字符串就可以做到这一点

效率不高,但

public static String repeatLetters(int multiplier, String text)
{  
  String repeat = new String();

  for (int i = 0; i < text.length(); i++)
  {
     for (int j = 0; j < multiplier; j++)
     { 
        repeat+=text.charAt(i);
        //Or maybe repeat+=new String(text.charAt(i));
     }
  }

  System.out.println("Letters Repeated:");
  System.out.println("-----------");
  System.out.println(repeat);
  System.out.println("--------------");

  return repeat;
}
publicstaticstringrepeatLetters(整数乘数,字符串文本)
{  
字符串重复=新字符串();
对于(int i=0;i
每次分配字符串时,实际上都会分配一个新对象,并将旧对象发送到Java 8中的垃圾收集中

public static String repeatChars(final String in, int numTimes) {
    return IntStream.range(0, in.length()).
            mapToObj(Integer::valueOf).
            flatMap((index) -> IntStream.range(0, numTimes).mapToObj((rep) -> String.valueOf(in.charAt(index)))).collect(Collectors.joining());
}
这基本上做了同样的事情。它还在引擎盖下使用了一个
StringBuilder
,因此应该比显式使用效率低一点-它必须在过程中创建许多
String
对象,但相同的
String
(重复)应该在迭代中共享


本质上,我们取范围
[0,in.length)
IntStream
,对于每个
int
我们将其转换为
整数
,然后
flatMap
一个新的
IntStream
范围
[0,numTimes)
,我们将每个
int
映射到
字符串.valueOf(in.charAt(索引))
;即,我们在第一个
流中的当前点重复第二个
中的每个元素的字符。然后,我们使用
收集器将
收集到
字符串中。连接()

在您的特殊情况下,您可以简化代码。但在大多数情况下,使用
StringBuilder
是更好的选择。而“直接使用
String
根本不是选择

public static String repeatLetters(int multiplier, String text) {
    final int numChars=text.length();
    char[] data=new char[numChars*multiplier];
    for(int i=0, j=0, k=multiplier; i<numChars; i++, j=k, k+=multiplier)
        Arrays.fill(data, j, k, text.charAt(i));
    return new String(data);
}
publicstaticstringrepeatLetters(整数乘数,字符串文本){
final int numChars=text.length();
字符[]数据=新字符[numChars*乘数];

对于(int i=0,j=0,k=multiplier;iyou可以在循环中使用字符串文字而不是StringBuilder,并使用+而不是append(),但这不是一个好的做法…当然,每次只需将字符串与自身和下一个文本连接起来。
String value=“”;value+=text.charAt(i)
你为什么要这样做?repeat.toString()有什么问题吗?
你可以去掉
toString()
只需将返回类型更改为
CharSequence
即可调用。我总是尽可能使用
CharSequence
,因为您也可以使用
CharSequence
执行许多通常使用
String
的事情,并且可以自由使用
String
StringBuilder
CharBuffer
等。如果你真的需要一个
String
字符串,你仍然可以调用
toString()
在该位置的
CharSequence
上创建一个
新的StringBuilder
,该StringBuilder也需要GC'd.@Boristeider当您实例化一个新的StringBuilder时,您实例化一个正在增长的对象。每次执行a+=b时,您实例化b,然后实例化一个新的a.b,旧的a会被丢弃。StringBuilder w直到方法结束为止。
a+=b
实际上是
a=newstringbuilder(a).append(b).toString()
编译时,请记住
字符串是不可变的。这是我指的额外的
StringBuilder
。记住-它是为每次迭代创建的。+1,不错的技巧。我认为你不一定需要所有这些迭代器,但是-
j
k
可以合并成一个。@Boris TheSpider:我又决定了st合并它们,可能意味着执行超出必要的
+乘法器
,或者使用可读性较差的语法(
+=
在循环体中)。