[JavaSE]认识String类(StringBuffer和StringBuilder)
StringBuffer 和 StringBuilder
首先来回顾下String类的特点
- 任何的字符串常量都是 String 对象,而且 String 的常量一旦声明不可改变(反射可以),如果改变对象内容,改变的是引用的指向而已。
- 通常来讲 String 的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer 和 StringBuilder 类。
- StringBuffer 和 StringBuilder 大部分功能是相同的,本篇文章主要介绍 StringBuffer
- 在String中使用"+"来进行字符串连接,但是这个操作在 StringBuffer 类中需要更改为 append() 方法
public synchronized StringBuffer append(各种数据类型 b)
范例:观察StringBuffer使用
public static void main(String[] args) { //方式1: StringBuilder sb = new StringBuilder("Nick"); //方式2: sb.append('好').append("可爱"); //底层调用的是toString方法,因此可以直接输出,主要重写了toString就能显示 System.out.println(sb); }
String 和 StringBuffer 最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer
为了更好理解String和StringBuffer,我们来看这两个类的继承结构
String类 | StringBuffer类 |
---|---|
public final class String implements java.io.Serializable, Comparable, CharSequence | public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence |
可以发现两个类都是"CharSequence"接口的子类。这个接口描述的是一系列的字符集。所以字符串是字符集的子类,如果以后看见CharSequence,最简单的联想就是字符串。
注意:String 和 StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuffer:利用StringBuffer的构造方法或append()方法
- StringBuffer变为String:调用toString()方法。
//StringBuilder也一样 /*String->StringBuffer*/ public static StringBuffer func1(){ String str="Nick"; return new StringBuffer(str); } /*StringBuffer->String*/ public static String func2() { StringBuffer sb = new StringBuffer(); return sb.toString(); }
除了append()方法外,StringBuffer 也有一些String类没有的方法:
- 字符串反转
//public synchronized StringBuffer reverse() public static void main(String[] args) { StringBuilder sf = new StringBuilder(); sf.append("Nick"); System.out.println(sf.reverse());//kciN }
- 删除指定范围的数据
//public synchronized StringBuffer delete(int start, int end) public static void main(String[] args) { StringBuilder sf = new StringBuilder(); sf.append("Nick1234567890"); System.out.println(sf.delete(4,14));//Nick }
- 插入数据
//public synchronized StringBuffer insert(int offset, 各种数据类型 b) public static void main(String[] args) { StringBuilder sf = new StringBuilder(); sf.append("Nick"); System.out.println(sf.insert(4,"好可爱"));//Nick System.out.println(sf.insert(4,"真的"));//Nick真的好可爱 }
先来看一个拼接代码
public static void main(String[] args) { String str="abc"; for (int i = 0; i < 10; i++) { str+=i; } System.out.println(str);}
- 源码分析
//严格按照源代码进行还原 public static void main(String[] args) { String str="abc"; for (int i = 0; i < 10; i++) { StringBuilder sb = new StringBuilder(); sb.append(str).append(i); str=sb.toString(); } System.out.println(str);//abc0123456789 }//不难发现每次循环都new 了一个StringBuilder对象
//现在我稍做修改 public static void main(String[] args) { String str="abc"; StringBuilder sb = new StringBuilder(); sb.append(str); for (int i = 0; i < 10; i++) { sb.append(i); } System.out.println(sb); }
局部结论
- 如果在循环里面,进行字符串的拼接,尽量不要使用String,优先使用 StringBuffer 和 StringBuilder
局部问题
面试题:请解释String、StringBuffer、StringBuilder的区别?
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作