前言
StringBuffer 、 StringBuilder、 String 是三种数据类型
首先来回顾下String类的特点:
- 任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
- 通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类。
- StringBuffer 和 StringBuilder 大部分功能是相同的,主要介绍 StringBuffer
- 在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法
一、观察String 对象在进行字符串拼接
public static void main(String[] args) {
String str = "acbcd";
str = str + "123";
System.out.println(str);
}
所以String类型在进行字符串拼接的时候,会优化成StringBuilder对象,然后在来进行拼接,拼接完之后在调用StringBuilder类的ToString方法,返回一个新的String对象,这时str引用的就是StringBUilder返回的对象
二、观察StringBuilder的使用
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abcde");
System.out.println(sb);
}
通过StringBuilder的append方法进行拼接
append这个方法的作用就是拼接,是在StringBuilder对象内容的后面拼接,不会产生新的对象,操作的是同一个对象
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abcde");
sb.append("123");
System.out.println(sb);
}
append().append(),还可以连用
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abcde");
sb.append("123").append("999");
System.out.println(sb);
}
三、StringBuilder 和 StringBuffer 的区别
String和StringBuffer最大的区别在于:
- String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。
为了更好理解String和StringBuffer,我们来看这两个类的继承结构:
可以发现两个类都是"CharSequence"接口的子类。这个接口描述的是一系列的字符集。所以字符串是字符集的子
类,如果以后看见CharSequence,最简单的联想就是字符串
StringBuilder 和 StringBuffer 的功能基本上都是差不多的,只是存在一些细微的差别
都具有append,insert等等的功能
但是我们仔细的看看区别
字符串反转
StringBuffer也有一些String类没有的方法:
public synchronized StringBuffer reverse()
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("123456");
stringBuffer.reverse();
System.out.println(stringBuffer);
}
把字符串转变成StringBuilder类型/StringBuffer类型,必须调用对应的构造方法
注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuffer:利用StringBuffer的构造方法或append()方法
- StringBuffer变为String:调用toString()方法
public static void main(String[] args) {
String str = "abcde";
StringBuilder stringBuilder = new StringBuilder(str);
System.out.println(stringBuilder);
System.out.println("--------------");
StringBuffer stringBuffer = new StringBuffer(str);
System.out.println(stringBuffer);
}
StringBuilder类型/StringBuffer类型 转变成 String类型,调用 toString 方法
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("abcde");
String str1 = stringBuilder.toString();
System.out.println(str1);
System.out.println("---------");
StringBuffer stringBuffer = new StringBuffer("123456");
String str2 = stringBuffer.toString();
System.out.println(str2);
}
面试题:请解释String、StringBuffer、StringBuilder的区别:
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作