> 文档中心 > [JavaSE]认识String类(StringBuffer和StringBuilder)

[JavaSE]认识String类(StringBuffer和StringBuilder)

StringBuffer 和 StringBuilder

首先来回顾下String类的特点

  • 任何的字符串常量都是 String 对象,而且 String 的常量一旦声明不可改变(反射可以),如果改变对象内容,改变的是引用的指向而已。
  • 通常来讲 String 的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBufferStringBuilder 类。
  • StringBufferStringBuilder 大部分功能是相同的,本篇文章主要介绍 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未采用同步处理,属于线程不安全操作