String类是不可变类,任何对String的改变都会引发新的String对象的生成;
StringBuffer类是可变类,任何对StringBuilder的改变不会产生新的对象,StringBuilder与其原理和操作基本相同。
继承关系:
StringBuffer和StringBuiler都继承自AbstractStringBuilder类。
区别:
StringBuffer支持并发操作,是线程安全的,适合在多线程中使用;
StringBuilder不支持并发操作,不是线程安全的,不适合在多线程中使用;
新引入的StringBuilder不是线程安全的,但是在单线程中的性能比StringBuffer高;
如果程序是单线程下运行的,或者不必考虑线程同步问题时,优先使用StringBuilder,如果要保障线程安全,一定使用StringBuffer。
StringBuffer构造方法
StringBuffer sb = new StringBuffer(); | 初始化一个空对象 |
StringBuffer sb = new StringBuffer(521); | 初始化对象分配了长度521字节的字符缓冲区 |
StringBuffer sb = new StringBuffer("Hello world") | 创建带有内容的对象,在字符缓冲区存放字符串 "Hello world" |
StringBuffer常见方法
① sb.append("hello");
追加hello到当前StringBuffer对象sb的末尾,类似于字符串的拼接;
使用该方法进行字符串的拼接,比String更加节约内容,常用于SQL语句连接。
② sb.deleteCharAt(1);
删除sb对象中索引值为1的字符,也就是删除第二个字符。
③ sb.delete(int start,int end);
删除sb对象中索引从start到end的区间的字符(包含start,不包含end)。
④ sb.insert(4,"abc");
在sb对象中索引值为4的位置插入字符串"abc"。
⑤ sb.reverse();
将对象sb中的内容反转。
⑥ sb.setCharAt(int index,char ch);
修改对象中索引值为index位置的字符为新的字符ch。
⑦ int i = sb.capacity();
获取字符串的容量。
⑧ sb.length();
⑨ sb.trimToSize();
将sb对象中存储空间缩小到和字符串一样的长度,减少空间的浪费。
⑩ sb.getChars(int start,int end,char chars[],int charStart);
将字符串的子字符串复制给数组;
字符数组的长度一定要大于等于start到end之间字符的长度,小于会报数组越界异常,大于会以空字符补齐。