TestStringBuilder类
package commonClass;
/**
* Test StringBuilder, StringBuffer variable character sequence
* @author Sober
*
*/
public class TestStringBuilder {
public static void main(String[] args) {
String string;
//StirngBuilder is not thread safe but high efficienct(which is usually used); StringBuffer is thread safe but low efficient.
StringBuilder sBuilder = new StringBuilder("abcdefg");
System.out.println(Integer.toHexString(sBuilder.hashCode()));
System.out.println(sBuilder);
//even char is changed but hashcode does not change
sBuilder.setCharAt(2, 'M');
System.out.println(Integer.toHexString(sBuilder.hashCode()));
System.out.println(sBuilder);
}
}
运行结果:
2a139a55
abMdefg
总结
String类型一旦确定就无法改变,任何改变实际上都是重新进行了拷贝和复制;但使用StringBuilder,则是可变的序列。
TestStringBuilder2类
package commonClass;
/**
* Test StringBuilder and StringBuffer common method
* @author Sober
*
*/
public class TestStringBuilder2 {
public static void main(String[] args) {
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < 26; i++) {
char temp = (char)('a' + i);
sBuilder.append(temp);
}
System.out.println(sBuilder);
sBuilder.reverse();
System.out.println(sBuilder);
sBuilder.setCharAt(4, '马');
System.out.println(sBuilder);
sBuilder.insert(0, '马').insert(6, '爱').insert(10, '诺');
System.out.println(sBuilder);
sBuilder.delete(20, 23);
System.out.println(sBuilder);
}
}
运行结果:
abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba
zyxw马utsrqponmlkjihgfedcba
马zyxw马爱uts诺rqponmlkjihgfedcba
马zyxw马爱uts诺rqponmlkjfedcba
TestStringBuilder3类
package commonClass;
/**
* Test StringBuilder and StringBuffer traps
* @author Sober
*
*/
public class TestStringBuilder3 {
public static void main(String[] args) {
//use String to splice charaters
String string1 = "";
long num1 = Runtime.getRuntime().freeMemory();
long time1 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
string1 = string1 + i;
}
long num2 = Runtime.getRuntime().freeMemory();
long time2 = System.currentTimeMillis();
System.out.println("String occupies memory:" + (num1 - num2));
System.out.println("String occupied time:" + (time2 - time1));
//use StringBuilder to splice characters
StringBuilder sBuilder = new StringBuilder("");
long num3 = Runtime.getRuntime().freeMemory();
long time3 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
sBuilder.append(i);
}
long num4 = Runtime.getRuntime().freeMemory();
long time4 = System.currentTimeMillis();
System.out.println("StringBuilder occupied memory:" + (num3 - num4));
System.out.println("StringBuilder occupied time:" + (time4 - time3));
}
}
运行结果:
String occupies memory:12786760
String occupied time:65
StringBuilder occupied memory:0
StringBuilder occupied time:0
总结
在进行for循环的时候,使用String将会额外开辟非常多的数组,耗时耗空间,但因为StringBuilder是在原字符序列末尾进行了增加,所以空间和时间消耗,大大降低。