平时在遇到字符串相关问题时,如果要进行字符串的拼接,会有什么问题?
答:因为Java中的字符串是不可变的(而且在常量池中不可被垃圾回收器回收),每次拼接都会产生新的字符串,这样会占用大量的方法区内存,造成内存空间的浪费。于是,就有了很适合字符串拼接等操作的StringBuffer和StringBuilder
一、StringBuffer
1)基础概念:
1.String类对象一旦创建就不可更改
2.如果经常对字符串内容进行修改,则使用StringBuffer。
3.如果经常对字符串内容进行修改而使用String的话,就会导致即耗空间又耗时间。
例:String s1 =“abasdmasc”; String str2 =“123”
(1):String s1 = s1 + s2;
(2):删除str1中的字母d
4.StringBuffer 对象的内容是可以改变的,因此String类中没有修改字符串的方法,但是StringBuffer类中却有大量修改字符串的方法
2).StringBuffer类的构造函数:
1.public StringBuffer():
创建一个空的没有任何字符的StringBuffer对象
2.public StringBuffer(int capacity):
创建一个不带字符,但具有指定初始容量的字符串缓冲区。
3.public StringBuffer(String str):
创建一个StringBuffer对象,包含与str对象相同的字符序列
3. StringBuffer常用方法(1):
重载方法public StringBuffer append(…) 可以为该stringBuffer对象添加字符序列,返回添加后的该StringBuffer对象引用(可以简单理解为拼接),例如:
public StringBuffer append(String str);
public StringBuffer append(StringBuffer sbuf);
public StringBuffer append(char[] str);
public StringBuffer append(char[] str,int offset,int len);
public StringBuffer append(double d);
public StringBuffer append(Object obj);
…
(API文档里有完整的)
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("a");
stringBuffer.append("b");
stringBuffer.append('c');
stringBuffer.append(123);
System.out.println(stringBuffer);
}
}
输出结果:abc123
4. StringBuffer常用方法(2):
1)重载方法public StringBuffer insert(…)可以为该stringBuffer 对象在指定位置插入字符序列,返回修改后的该stringBuffer对象引用,例如:
public StringBuffer insert(int offset,String str);
public StringBuffer insert(int offset,double d);
… …
2)方法 public StrinqBuffer delete(int start,int end) 可以删除从start开始到end为止的一段字符序列,返回修改后的该stringBuffer对象引用
二、StringBuilder
1.StringBuilder和StringBuffer功能差不多,也是可以完成字符串的拼接
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append(1);
stringBuilder.append('e');
stringBuilder.append("zv");
System.out.println(stringBuilder);
}
}
运行结果:1ezv
2.那Stingbuffer和StringBulider有什么区别呢?
- StringBuffer中的方法都有:synchronized关键字修饰。表示StringBuffer在多线程环境下运行是安全的,即是线程安全的。
- StringBuilder中的方法都没有:synchronized关键字修饰,表示StringBuilder在多线程环境下运行是不安全的,即是非线程安全的。