一、首先来回顾下String类的特点:
1>任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
例1:
String str = “abc”;
str = “bcd”;
如上,字符串 str 明明是可以改变的呀!其实不然,str 仅仅是一个引用对象,它指向一个字符串对象“abc”。第二行代码的含义是让 str 重新指向了一个新的字符串“bcd”对象,而“abc”对象并没有任何改变,只不过该对象已经成为一个不可及对象罢了。
而今天所说的StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。 具体见下面详细说明:
二、StringBuffer/StringBuilder详细介绍:
1.StringBuffer与StringBuilder
1)为什么提出StringBuffer与StringBuilder?
通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类。
2)StringBuffer与StringBuilder的异同:
- 相同点:StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同
- 区别:StringBuilder 是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比 StringBuffer 要高。
3)StringBuilder 和String是线程不安全的,用于单线程;StringBuffer 是线程安全的,用于多线程
2.StringBuffer/StringBuilder 的常用API:
我们主要介绍 StringBuffer
- 字符串反转:public synchronized StringBuffer reverse()
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());
- 删除指定范围的数据:
public synchronized StringBuffer delete(int start, int end)
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10));
- 插入数据:public synchronized StringBuffer insert(int offset, 各种数据类型 b)
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10).insert(0, "你好"));
- 字符串拼接:public synchronized StringBuffer append()
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
System.out.println(sb);
3.String和StringBuffer两个类的继承结构:
可以发现两个类都是"CharSequence"接口的子类。这个接口描述的是一系列的字符集。所以字符串是字符集的子类,如果以后看见CharSequence,最简单的联想就是字符串。
4.String和StringBuffer字符串拼接:
1.StringBuffer的字符串拼接采用append()方法:
public synchronized StringBuffer append(各种数据类型 b)
示例代码如下:
public class Test{
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
fun(sb);
System.out.println(sb);
}
public static void fun(StringBuffer temp) {
temp.append("\n").append("www.bit.com.cn");
}
}
2.String的字符串拼接采用"+"来实现:
String str1="lo";
String str2="ve";
String str=str1+str2;
"+"底层被优化为以下三个关键:
- 创建StringBuilder()对象
- 调用两次append()方法进行拼接
- 使用toString()转为String对象
具体来看代码:
public static void main(String[] args)
{
String s = "abc";
String ss = "ok" + s ;
System.out.println(ss);
}
通过" javap -c 文件名 "命令反编译成汇编代码:
如下是反汇编的字节码代码:
由此可以总结:
-
1)从上面的代码很容易看出,虽然在源程序中使用了"+",但在编译时仍然将"+"转换成 StringBuilder。因此,我们可以得出结论,在 Java 中无论使用何种方式进行字符串连接,实际上都使用的是 StringBuilder。
-
2)使用append()方法比String的“+”在效率上更快!
-
3)String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。
5.String和StringBuffer转换:
【注意】 String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuffer:利用StringBuffer的构造方法或append()方法
- StringBuffer变为String:调用toString()方法。
代码:
String变为StringBuffer:
public static void main(String[] args)
{
//方式一:StringBuffer的构造方法
String str1 = "abc";
StringBuffer sb1 = new StringBuffer( str1 ) ;
//方式二:append()方法
String str2 = "abc";
StringBuffer sb2 = new StringBuffer() ;
sb2.append(str2 )
}
StringBuffer变为String:
public static void main(String[] args)
{
StringBuffer sb1 = new StringBuffer( "abc") ;
String str2 = sb1.toSting();
}
三、String、StringBuffer、StringBuilder区别:
- String的内容无法修改,而StringBuffer/StringBuilder的内容可以修改。
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作;StringBuilder/String用于单线程
- String和StringBuffer/StringBuilder在拼接字符串方式上不同