StringBuffer类
String特点:
- 每一个字符串的常量都属于一个String类的匿名对象,并且不可更改。
- String有两个常量池:静态常量池、运行时常量池
- String类对象实例化建议使用直接赋值的形式完成,可以直接将对象保存在对象池之中方便下次重用。
弊端:内容部不允许修改
解决方案:StringBuffer类
范例:来观察String与StringBuffer类的对比
//String类
public class StringDemo{
public static void main(String[] args) {
String str = "Hellow";
change(str);
System.out.println(str);
}
public static void change(String temp) {
temp += "Word!";
}
}
Hellow
结果并未改变
String必须像普通对象一样进行实例化才可以进行处理
- 构造方法:public StringBuffer();
- 数据追加:public StringBuffer append(数据类型 变量),相当于字符串中的“+”。
//StringBuffer类
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer stringbuffer = new StringBuffer("Hellow");
change(stringbuffer);
System.out.println(stringbuffer.toString());
}
public static void change(StringBuffer temp) {
temp.append(" Word!");
}
}
Hellow Word!
大部分情况下很少出现字符串内容的改变,这种改变指的并不是静态常量池的改变。
public class Demo {
public static void main(String[] args) {
String strA = "www.baidu.com";
String strB = "www."+"baidu"+".com";
System.out.println(strA == strB);
}
}
true
注意:这种形式并不算改变,编译之后strB与strA的内容是一样的,String在编译时的变化如下:
String strA = "WWW."+"BAIDU"+".COM"; //在编译运行时的情况 StringBuffer buf = new StringBuffer(); buf.append("WWW.").append("BAIDU").append(".COM")
String与StingBuffer之间本来就可以互相转换,“+”等同“append()”
- String类变为StringBuffer可以依靠StringBuffer类的构造方法或者append()方法
- 所有的对象都可以通过toString()方法变为字符串
String类不具备但StringBuffer具备的方法:
- insert(int 脚标,数据类型 内容):在指定的脚标位置插入指定内容
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append(".com").insert(0, "www.").insert(4, "baidu");
System.out.println(buf);
}
www.baidu.com
- delete(int 开始脚标,int 结束脚标):删除范围的数据
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append(".com").insert(0, "www.").insert(4, "baidu").delete(4, 9);
System.out.println(buf);
}
www..com
- reverse():String内容反转
public class StringBuffer类 {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
buf.append(".com").insert(0, "www.").insert(4, "baidu").reverse();
System.out.println(buf);
}
moc.udiab.www
实际上与StringBuffer类还有一个类似的功能类:StringBuider类,JDK1.5提供。该类中提供的方法与StringBuffer功能相同,最大的区别在于StringBuffer类的方法属于线程安全的,全部使用了syncrhrozed关键字进行标注,而StringBuider类属于非线程安全的。
面试题:解释String、StringBuffer与StringBuider的区别?
- String类是字符串的首选类型,其最大的特点是内容不允许修改
- StringBuffer与StringBuider类的内容允许修改
- StringBuffer是在JDK1.0提供的,属于线程安全的操作,StringBuider是在JDK1.5提供的,属于非线程安全操作。