在Java语言中,共有byte、short、int、long、float、double、boolean、char 8个基本数据类型,其中char类型表示单个
字符。在实际的编程过程中,我们比较常用的是由多个字符组成的“字符串”,由于没有表示“字符串”的基本数据类型,所以Java
提供了一个被final修饰、不能被继承的类String,从而为我们能够使用字符串类型提供了方便。随着Java语言的不断发展,又衍
生出了StringBuffer和StringBuilder两个字符串构建器。
对于String、StringBuffer、StringBuilder这三种类型,无论在求职过程中的面试还是以后的实际工作中,我们都要经常面
对,所以掌握三者分别的内容、特点、用途、注意事项及三者之间的区别显得尤为重要。
1. String
通过以上所述,我们已经大致知道String类型是一个被final关键字修饰、不能被继承类,包含在java.lang包。关于String类
的实例化,有以下两种方法,一种是直接赋值法,这种方法最为常用;另一种是传统方法,使用new关键字进行实例化,具体如
下:
//1.直接赋值
String str = "Hello World !" ; // str是一个对象,那么"Hello World !" 就应该保存在堆内存中
//2.传统方法(构造法)
String str = new String("Hello World !");//该方法符合传统做法,使用关键字new进行对象实例化。
String类的具体用法请参照我的“String类“==”与equals()的区别”与“String类的常用方法总结”博文,其中对String类的常用方法进行
了较为详细地说明,有兴趣的童鞋可以参考参考。
String 类的缺陷 :不能对String类创建的对象进行增、删、改等操作;
String类不能被继承。
String 类的特点:任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的只
是其引用的指向而已。
2. StringBuffer
StringBuffer 类是为了解决String 类的缺陷中不能对String 类创建的对象进行增、删、改等操作而产生的。StringBuffer 类
有很多和String 类一样的方法,这些方法在功能上和String中的功能相同。
String类中使用“ + ”来进行字符串连接,但是这个操作在StringBuffer类中需要更改为appen() 方法:
public synchronized StringBuffer append(各种数据类型 b)
StringBuffer类中字符串连接操作的简单举例:
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("happy").append("everyday");
}
}
2.1 String 类和 StringBuffer 类的区别:
2.1.1 String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况建议使用StringBuffer 类;
2.1.2 StringBuffer 类的内部实现方式和String 类不同,StringBuffer 类在进行字符串修改时不产生新的对象。在内存的使
用上StringBuffer类优于String类;
2.1.3 StringBuffer对象的初始化与String对象的初始化不大相同。通常情况下采用构造方法对StringBuffer的对象进行初始
化;
2.1.4 StringBuffer是线程安全的,可用于多线程。
2.2 String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
2.2.1 String变为StringBuffer:利用StringBuffer的构造方法或append()方法;
2.2.2 StringBuffer变为String:调用toString()方法。
2.3 StringBuffer类中String类没有的方法:
2.3.1 字符串反转:
public synchronized StringBuffer reverse()
2.3.2 删除指定范围的数据:
public synchronized StringBuffer delete(int start, int end)
2.3.3 插入数据
public synchronized StringBuffer insert(int offset, 各种数据类型 b)
3. StringBuilder
在JDK5.0 之后,Java语言有引入了StringBuilder 类,这个类是在StringBuffer类的基础上产生的。StringBuilder类的效率
较低,但允许采用多线程的方式进行添加或者删除字符的操作。如果所有的字符串在一个单线程中,则应该需要用StringBuilder
类。StringBuilder 类和StringBuffer类的api完全相同。
4. String 、StringBuffer 、StringBuilder的区别:
4.1 操作效率方面:StringBuilder > StringBuffer > String;
4.2 线程安全方面:StringBuffer是线程安全的,可用于多线程;StringBuilder是非线程安全的,可用于单线程;
4.3 频繁字符串操作方面:StringBuilder和StringBuffer优于String;
4.4 String的内容不可修改,StringBuffer和StringBuilder的内容可以修改。这里的修改指的是字符串的内容或长度;
4.5 StringBuffer 采用同步处理,属于线程安全操作;StringBuilder采用异步处理,属于线程不安全操作。