一、问题
如何更好的在循环内使用字符串拼接,就是别造成内存压力
二、分析
这是阿里java开发手册里面提到的:
但是项目上想要的是每次循环进行拼接的时候,都要拼接成新的字符串进行使用。
三、测试字符串拼接效率
3.1测试花费时间
int maxNum = 10000;
long start = System.currentTimeMillis();
String str;
for (int i=0; i<maxNum; i++) {
str = "1" + "2" + "3";
}
System.out.println("字符串拼接花费时间:" + (System.currentTimeMillis() - start));
long start2 = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < maxNum; i++) {
stringBuffer.setLength(0);
stringBuffer.append("1").append("2").append("3");
}
System.out.println("stringBuffer拼接花费时间:" + (System.currentTimeMillis() - start2));
long start3 = System.currentTimeMillis();
for (int i = 0; i < maxNum; i++) {
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2.append("1").append("2").append("3");
}
System.out.println("stringBuffer2拼接花费时间:" + (System.currentTimeMillis() - start3));
long start4 = System.currentTimeMillis();
StringBuffer stringBuffer3 = new StringBuffer();
for (int i = 0; i < maxNum; i++) {
stringBuffer3.append("1").append("2").append("3");
}
System.out.println("stringBuffer3拼接花费时间:" + (System.currentTimeMillis() - start4));
测试结果:
字符串拼接花费时间:0
stringBuffer拼接花费时间:3
stringBuffer2拼接花费时间:3
stringBuffer3拼接花费时间:1
3.2测试内存花费
int maxNum = 10000;
Runtime runtime = Runtime.getRuntime();
runtime.gc();
long startMem = runtime.freeMemory();
String str;
for (int i=0; i<maxNum; i++) {
str = "1" + "2" + "3";
}
System.out.println("字符串花费内存:" + (startMem - runtime.freeMemory()));
runtime.gc();
long startMem2 = runtime.freeMemory();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < maxNum; i++) {
stringBuffer.setLength(0);
stringBuffer.append("1").append("2").append("3");
}
System.out.println("stringBuffer花费内存:" + (startMem2 - runtime.freeMemory()));
runtime.gc();
long startMem3 = runtime.freeMemory();
for (int i = 0; i < maxNum; i++) {
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2.append("1").append("2").append("3");
}
System.out.println("stringBuffer2花费内存:" + (startMem3 - runtime.freeMemory()));
runtime.gc();
long startMem4 = runtime.freeMemory();
StringBuffer stringBuffer3 = new StringBuffer();
for (int i = 0; i < maxNum; i++) {
stringBuffer3.append("1").append("2").append("3");
}
System.out.println("stringBuffer3花费内存:" + (startMem4 - runtime.freeMemory()));
测试结果
字符串花费内存:1363184
stringBuffer花费内存:1363184
stringBuffer2花费内存:2044776
stringBuffer3花费内存:1363184
3.3结论
根据测试了花费的时间和内存来看,在一万数量下,选择“+”这个比较好,但是有个疑问就是阿里java开发手册说使用“+”会比较消耗内存资源,所以就这个点,不知道怎么测试,怎么去验证。
四、“+”和StringBuilder
1)使用"+"拼接字符串
public class StringTest {
public static void main(String[] args) {
String firstStr = "1" + "2";
String secondStr = "3";
System.out.println(firstStr + secondStr);
}
}
2)使用jad反编译后得到
public class StringTest
{
public StringTest()
{
}
public static void main(String args[])
{
String s = "12";
String s1 = "3";
System.out.println((new StringBuilder()).append(s).append(s1).toString());
}
}
3)结论
所以的话,“+”号拼接字符串最后还是使用StringBuilder来拼接的。