/**
* StringBuilder和StringBuffer
* StringBuilder可变字符序列 不做线程同步检查 效率高 常用
* StringBuffer可变字符序列 做线程同步检查 效率低
* StringBuilder和StringBuffer的方法用法相同
*/
public class TestString2 {
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder("asd");
//写成StringBuilder s1 = "asd"会报错 "asd"是String类 StringBuilder和StringBuffer都不可以用""字符串直接赋值
//new StringBuilder(String str) 输入的asd是String类
StringBuffer s2 = new StringBuffer();
//无参 返回空字符串"" new对象的value为长度16的char[]数组
s2.app(s1);
System.out.println(s2+"的结果为asd");
//在原始字符串的结尾app附加实参字符串 返回this本身 不会额外new新的字符串返回
s2.app(s1).app("a").app(s1);
System.out.println(s2+"的结果为asdasdaasd");
//因为.app()会返回this 所以 s2.app(s1)返回变长的s2后面再接.app("a")返回变长的s2再接.app(s1)依然返回this对象本身
// 后面还可以.方法名()调用StringBuffer的所有方法
s2.delete(1,3).delete(0,1);
System.out.println(s2+"的结果为asdaasd");
//.delete(start,)删除index从start至-1位置的字符 同样返回this后面可以继续.方法名()
s2.deleteCharAt(1).deleteCharAt(0);
System.out.println(s2+"的结果为daasd");
//.deleteCharAt(index)删除索引位的字符 返回this
s2.insert(0,s1).insert(1,1);
System.out.println(s2+"的结果为a1sddaasd");
//.insert()在index位插入字符 index位原来的字符及后面的字符往后移位 返回this
System.out.println(s2.reverse()+"的结果为dsaadds1a");
//.reverse()将字符串反转 返回this
String str1 = "";
long memory1Start = Runtime.getRuntime().freeMemory();
//获得JVM虚拟机可用的系统剩余内存空间 Runtime.getRuntime()返回new Runtime对象 .freeMemory()可用内存 返回值类型为long
long time1Start = System.currentTimeMillis();
//current当前的 millisecond毫秒 获得当前时间 单位毫秒 值为当前时间减去1970-01-01 0:00 返回值类型为long
for (int i =0;i<5000;i++){
str1 = str1+i;
//拼接i new一个新的字符串赋值给str1 循环5000次即new5000个字符串对象
}
long memory1End = Runtime.getRuntime().freeMemory();
long time1End = System.currentTimeMillis();
System.out.println(memory1Start-memory1End+"占用内存38606648");
System.out.println(time1End-time1Start+"用时79");
StringBuilder str2 = new StringBuilder();
//使用StringBuilder拼接字符串
long memory2Start = Runtime.getRuntime().freeMemory();
long time2Start = System.currentTimeMillis();
for (int i = 0; i<5000;i++){
str2.app(i);
//将int加入字符串末尾 返回this 不产生新的字符串对象
}
long memory2End = Runtime.getRuntime().freeMemory();
long time2End = System.currentTimeMillis();
System.out.println(memory2Start - memory2End+"占用内存0");
System.out.println(time2End-time2Start+"用时0");
//大量拼接字符串操作使用StringBuilder
}
}