java切分字符串效率_在Java中串联字符串的最佳方法(时间效率)

我检查了许多有关在Java中连接许多字符串的最佳方法的争论。

据我了解,Stringbuilder比+运算符更有效。

不幸的是,我的问题有点不同。

给定字符串:"AAAAA",我们如何将其与n倍于char '_'的字符串连接,知道'_'必须在字符串" AAAAA"之前

如果n等于3和str="AAAAA",则结果必须为字符串" ___AAAAA"

String str ="AAAAA";

for (int i=0;i<100;i++){

str="_"+str;

}

在我的程序中,我有一个Longs String,所以我必须使用有效的方法。

谢谢

编辑1:

当我阅读一些解决方案时,我发现我只要求一个案例,所以我来到了这个我认为很好的解决方案:

public class Concatenation {

public static void main(String[] args) {

//so str is the String that i want to modify

StringBuilder str = new StringBuilder("AAAAA");

//As suggested

StringBuilder space = new StringBuilder();

for (int i = 0; i < 3; i++) {

space.append("_");

}

//another for loop to concatenate different char and not only the '_'

for (int i = 0; i < 3; i++) {

char next = getTheNewchar();

space.append(next);

}

space.append(str);

str = space;

System.out.println(str);

}

public static char getTheNewchar(){

//normally i return a rondom char, but for the case of simplicity i return the same char

return 'A';

}

}

为什么不能在单独的步骤中构建"___",然后再执行"___" +"AAAA"?

@ cricket_007对于这种情况是个好主意,但是在我的程序中,我不得不处理一般情况。您的解决方案仅对那些" _"情况有效。

不明白你的意思。但是,如果始终以str ="AAAAA"开头,则str ="_" + str绝对无效。您可以在一行中构建"___"。 stackoverflow.com/a/16812721/2308683然后,您只需使thatString + str

@ cricket_007我理解您的解决方案,但是我的程序比我上面提到的程序复杂。有时我每次用一个字符时,im程序都比较复杂,所以我每次都必须附加String。

如果您的程序更复杂,那么为什么要提供这个简单的示例?我只是说下划线可以预先填写。您无需将str重复复制到串联中

@ cricket_007首先,我感谢您的帮助。对于StackOverflow提出的问题,我尝试提出一个简单的示例,使其易于阅读,看起来像我的问题。

别担心。您不需要str = new StringBuilder("AAAAA"),顺便说一句,您只需在最后加上space.append("AAAAA");

串联Java中字符串的最佳方法:不用...。字符串在Java中是不可变的。 每次连接时,都会生成一个新的对象。 请使用StringBuilder。

StringBuilder sb = new StringBuilder();

for (int i=0;i<100;i++){

sb.append("_");

}

sb.append("AAAAA");

String str = sb.toString();

谢谢你我最初误解了这个问题。现在修复。

我不确定为什么要来回走,但是并不需要" _AAAA_AAAA_AAAA"。

如果您不知道最终字符串的大小,则StringBuilder是最好的方法,因为它可以根据需要分配内存。如果您知道最终字符串的大小,则无需创建复杂的对象即可进行简单的char数组填充。

@Sxilderik [检查此] [1]。它显示StringBuilder在连接字符串[1]时要快得多:java67.com/2015/05/4-ways-to-concatenate-strings-in-java.html嗯,我想我不知道如何正确设置链接在评论中

@ CraigR8806是的,但是它仍然比填充char数组慢

@ CraigR8806您的解决方案更现实,并且与cricket_007之前显示的想法相同,我将编辑问题以显示我错过的部分,谢谢。

如果设置为使用StringBuilder对象执行简单的char数组处理可以执行的操作,则至少可以使用sb.append(_)而不是sb.append("_")来获得一些循环。使用字符串保存单个字符始终会降低性能。

@zakzak让我感到困惑,为什么当您特别要求它时,却没有选择最快的方法来串联字符串(在Java中(时间效率)来串联字符串的最佳方法),但是好的,没问题:)

@Sxilderik你好,谢谢你的帮助,我给你投票。原因是我喜欢简单而不是复杂的解决方案。

转到char数组,分配合适的大小,填充数组,然后加总为字符串。

不能打败它。

public String concat(char c, int l, String string) {

int sl = string.length();

char[] buf = new char[sl + l];

int pos = 0;

for (int i = 0; i < l; i++) {

buf[pos++] = c;

}

for (int i = 0; i < sl; i++) {

buf[pos++] = string.charAt(i);

}

return String.valueOf(buf);

}

这比使用StringBuilder快得多

我会做类似的事情:

import java.util.Arrays;

...

int numUnderbars = 3;

char[] underbarArray = new char[numUnderbars];

Arrays.fill(underbarArray, '_');

String output = String.valueOf(underbarArray) +"AAAA";

但实际情况是,所提供的任何解决方案在运行时间上都可能会有所不同。

很好地使用Arrays.fill,感谢您的指导。另一方面,a.concat(b)比a + b快(不涉及StringBuilder)(但不要执行a.concat(b).concat(c)!)。

如果您不喜欢写循环使用

org.apache.commons.lang.StringUtils class repeat(str,n) method.

您的代码会更短:

String str=new StringBuilder(StringUtils.repeat("_",n)).append("AAAAA").toString();

顺便说一句:

问题的实际答案在该repeat方法的代码中。

当需要重复1或2个字符时,它将在循环中使用char数组,否则将使用StringBuilder附加解决方案。

不知道是否需要整个库的开销。 new StringBuilder(new String(new char[n]).replace("\0","_")).append("AAAAA").toString()

这与偏好有关。 StringUtils有很多有用的方法。并且您确定在替换方法中使用RegEx会比循环中简单的StringBuilder append更快吗?

不是很确定,但是它实际上不需要库就可以完成相同的操作。

通常,它取决于应用程序的性质-如果它是独立的简单应用程序,那么是的,最好不要使用库。如果它是服务器端应用程序,那么谁又在乎一个罐子(通常以前在这里)?

顺便说一句:@ CraigR8806的StringBuilder解决方案既简单又最好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值