1. String保存的字符常量不可改变
看例子:
String a="1";
a="2";
1
2
此处,先是"1"在内存开辟空间存储,然后a保存的是"1"的地址。在执行a=“2"时,注意不是将a指向地址的内容更换为"2”,而是又开辟了空间存储"2",然后把新的地址赋给了a。
也就说是,像"1"、“2”、“hello”等字符串常量是不可改变的,而a这种字符串对象保存的值是可以改变的,所以会发生这样的情况。
所以,考虑如下场景,要反复的修改字符串内容,则会反复的在新的地址空间存放新的字符串,最终会占用很多空间,垃圾收集器不得不更加频繁的收集垃圾,导致性能降低。
2. StringBuffer可以修改保存的内容
看例子:
StringBuffer sb=new StringBuffer("1");
sb.append("2");
1
2
首先sb保存的地址是"1"的地址,第二步时,该地址内容改为“12",没有使用新的地址。
所以当需要频繁的修改字符串时,建议使用StringBuffer类。
3. StringBuffer与StringBuilder
这两个类的方法是完全一样的,例如常用的:
append(T) 追加
insert(int,T) 插入
delete(int,int) 删除
唯一的区别是,StringBuffer类中的方法定义使用了synchronized进行修饰,表示StringBuffer中的方法都是同步方法,是线程安全的,而StringBuilder中的方法没有synchronized修饰,属于异步方法,线程不安全的。
老兄,如果不确定或者搞不懂是否需要线程安全,直接用StringBuffer,完事,可想而知安全需要代价,StringBuffer性能稍微差一点点。