String、StringBuffer与StringBuilder

一、首先来回顾下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的异同:

  1. 相同点:StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同
  2. 区别:StringBuilder 是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比 StringBuffer 要高。

3)StringBuilder 和String是线程不安全的,用于单线程;StringBuffer 是线程安全的,用于多线程

2.StringBuffer/StringBuilder 的常用API:

我们主要介绍 StringBuffer

  1. 字符串反转:public synchronized StringBuffer reverse()
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());
  1. 删除指定范围的数据:

public synchronized StringBuffer delete(int start, int end)

StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10));
  1. 插入数据:public synchronized StringBuffer insert(int offset, 各种数据类型 b)
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10).insert(0, "你好"));
  1. 字符串拼接: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区别:

  1. String的内容无法修改,而StringBuffer/StringBuilder的内容可以修改。
  2. StringBuffer与StringBuilder大部分功能是相似的
  3. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作;StringBuilder/String用于单线程
  4. String和StringBuffer/StringBuilder在拼接字符串方式上不同
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值