package com.mfs.stringtest;
public class StringTest {
private static String hello = "hello";
private static String blank = " ";
private static String world = "world";
private static String over = "!";
public static String addStrings1() {
return hello + blank + world + over;
}
public static String addStrings2() {
StringBuilder sb = new StringBuilder();
sb.append(hello);
sb.append(blank);
sb.append(world);
sb.append(over);
return sb.toString();
}
public static void main(String[] args) {
System.out.println(addStrings1());
System.out.println(addStrings2());
}
}
我们都知道String对象是不可变得,也就是说我们对String对象的任何修改、添加和删除操作所得到的都是一个全新的string对象。那么上边代码的addStrings1()方法按照常理来说每执行一个“+”(拼接)就会重新返回一个新的String对象(早期的java却是是这样)。这样创建大量的String对象无疑是浪费了大量的资源的。所以后期的java就对此做出了优化。当我们写了如addStrings1()这样的程序是,java虚拟机会为我们的代码做自动的优化。大体优化成如addStrings2
()这样的代码形式。可以看到java的优化程序中自动的创建了StringBuilder对象,然后用此对象在调用append()方法拼接字符串,最后调用toString()方法去返回一个拼接好的String字符串对象。
事实上,在大多数情况下情况下这种java的自动优化是非常有效的,我们可以仍然按照我们的管用习惯去用“+”拼接字符串,让java虚拟机自动帮我们实现优化,可以说是美滋滋了。
但我们不妨考虑下面StringTest2中addStrings1()中在循环体中拼接字符串的情况,按照java虚拟机自动优化的方法,他会帮我们优化成addStrings2()方法所示的形式。仔细观察addStrings()的代码你会发现,每次循环他都会自动创建一个StringBuilder对象,那么这样一来跟每次创建一个String对象有什么区别呢?最终结果都是创建了大量的对象,根本达不到优化的目的。这个时候想要优化String字符串的拼接优化就需要我们显示的使用StringBuilder对象了,手动优化后的代码如addStrings3()方法所示。
在这里插入代码片package com.mfs.stringtest;
public class StringTest2 {
private static String[] strs = { "hello", " ", "world", "!" };
public static String addStrings1() {
String str = "";
for(int i = 0; i < strs.length; i ++ ) {
str += strs[i];
}
return str;
}
public static String addStrings2() {
String str = "";
for(int i = 0; i < strs.length; i ++) {
StringBuilder sb = new StringBuilder(str);
sb.append(strs[i]);
str = sb.toString();
}
return str;
}
public static String addStrings3() {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < strs.length; i ++) {
sb.append(strs[i]);
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(addStrings1());
System.out.println(addStrings2());
System.out.println(addStrings3());
}
}