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合并它们,可能意味着执行超出必要的+乘法器
,或者使用可读性较差的语法(+=
在循环体中)。