1.String 和 StringBuffer 的区别:
String 是不可变的, String 每次生成一个对象的时候都会开一一块新空间, 增加内存开销. 例如
- public class TestString {
- public static void main(String[] args) {
- String s= new String("sss");
- String s2= new String("sss");
- String s3=s+s2;
- String s4="ssssss";
- String s5="ssssss";
- System.out.println(s3);
- System.out.println("String 值比较");
- System.out.println(s==s2);
- System.out.println(s3==s4);
- System.out.println(s4==s5);
- }
- }
打印输出
ssssss
String 值比较
- false
- false
- true
s 和 s2,s3 和 s4 都是 new 的 String 对象, 值都相同 (sss 和 ssssss). 但是用 == 比较都显示为 false.s4 和 s5 都是用同一个字符串对象 "ssssss" 指向各自. 用 == 比较都相同. 所以说当用 String 的 "+" 拼接字符串时其实是先 new 了一个 String 对象再指向原来的变量. 增大了开销.
StringBuffer 是一个可变的 String 对象. 不会另外开辟新空间, 比较节省内存
- public static void main(String[] args) {
- StringBuffer sb= new StringBuffer(16);
- sb.append("aaa");
- System.out.println(sb);
- sb.append("bbb");
- System.out.println(sb);
- }
打印输出
aaa
aaabbb
在需要频繁对一个 Sting 对象改动内容是最好使用 StirngBuffer 提高效率. 还有一个小诀窍, 在 new StingBuffer 对象时最好提前预测需要使用的字符串对象数量使用函数
new StringBuffer(int capacity) 指定数量. StringBuffer 默认大小 16 不够用时会自动扩容. 如果事先能够预测指定大小减少自动扩容操作可提高效率.
2.StringBuffer 和 StringBuilder 的区别
他们都是可变的 String 对象, StringBufffer 是线程安全的支持多线程. StringBuilder 是线程不安全的单线程. StringBuilder 效率更高. 在不考虑线程安全的情况下推荐使用 StringBuilder
来源: http://www.bubuko.com/infodetail-3414426.html