导语
很多新手都搞不懂String、StringBuffer、StringBuilder之间到底有什么区别,那就一点一点来说一下吧。
主要内容
- StringBuffer类的主要特点
- StringBuffer、StringBuilder、String的区别
具体内容
String类
String类的特点:
- String类对象有两种实例化方式:
- 直接赋值:只开辟一块堆内存空间,可以自动入池。
- 构造方法:开辟两块堆内存空间,不会自动入池,使用intern()手工入池。
- 任何一个字符串都是String类的匿名对象。
- 字符串一旦声明则不可改变,可以改变的只是String类对象的引用。
虽然在所有的项目里面,String类都一定要使用,可是String类有一个问题不得不进行重复,那么就是String类的内容不可改变。为此在Java里面提供有另一个类——StringBuffer类(内容可修改)。
StringBuffer类
String类的对象可以使用“+”进行字符串的连接操作,但是在StringBuffer类里面必须使用append()方法进行追加:
- public StringBuffer append(数据类型 变量)
范例:观察StringBuffer基本使用
public class TestDemo {
public static void main(String args[]) {
// String类可以直接赋值实例化,但是StringBuffer类不行
StringBuffer buf = new StringBuffer();
buf.append("Hello ").append("World ").append("!!!");
change(buf); // 引用传递
System.out.println(buf);
}
public static void change(StringBuffer temp) {
temp.append("\n").append("Hello MLDN .");
}
}
输出结果
Hello World !!!
Hello MLDN .
发现StringBuffer类的内容是可以进行修改的,而String的内容是不可以修改的。
观察两个类的区别:
String类: | StringBuffer类: |
---|---|
public final class String extends Object implements Serializable, Comparable<String>, CharSequence{} | public final class StringBuffer extends Object implements Serializable, CharSequence{} |
发现String与StringBuffer都是CharSequence接口的子类。而在以后的开发之中,如果看到某些方法出现的是CharSequence接口,那么应该清楚,只需要传递字符串即可。
CharSequence seq = "Hello"; // 向上转型
System.out.println(seq); // String类覆写的toString()
虽然String和StringBuffer类有着共同的接口,但是这两个类对象之间如果要转换不能够直接转换。
- 将String对象转换为StringBuffer对象:
- 方法一:利用StringBuffer类的构造方法(public StringBuffer(String str))。
- 方法二:利用append()方法(public StringBuffer append(String str))。
- 将StringBuffer对象转换为String对象:
- 利用toString()方法可以将StringBuffer转换为String。
- 也可以利用String类的构造方法转换(public String(StringBuffer buffer)。
在String类里面也提供有与StringBuffer比较的方法:public boolean contentEquals(StringBuffer sb)。
StringBuffer buf = new StringBuffer("Hello");
System.out.println("hello".contentEquals(buf));
System.out.println("Hello".contentEquals(buf));
输出结果
false
true
String类之中定义了许多的方法便于用户的开发,而在StringBuffer类里面也定义了许多的操作方法,而且部分方法与String类是正好互补的。
- 字符串反转:public StringBuffer reverse()。
- 在指定的索引位置增加数据:public StringBuffer insert(int offset, 数据类型 变量)。
- 删除部分数据:public StringBuffer delete(int start, int end)。
StringBuffer buf1 = new StringBuffer("Hello");
System.out.println(buf.reverse());
buf.insert(0, "MLDN ").insert(0, "你好 ");
StringBuffer buf2 = new StringBuffer("Hello");
System.out.println(buf);
StringBuffer buf3 = new StringBuffer("Hello World MLDN");
System.out.println(buf.delete(5, 11));
输出结果
olleH
你好 MLDN Hello
Hello MLDN
StringBuffer、StringBuilder、String的区别
从JDK1.5之后增加了一个新的字符串操作类:StringBuilder类,这个类的定义结构如下:
public final class StringBuffer extends Object
implements Serializable, CharSequence{}
发现StringBuffer类与StringBuilder类在定义上非常的相似,几乎连方法也一样。
查看源代码,发现StringBuffer的方法前都有synchronized关键字。
面试题:String、StringBuffer、StringBuilder的区别?
- String的内容一旦声明则不可改变,而StringBuffer与StringBuilder声明的内容可以改变。
- StringBuffer类中提供的方法都是同步方法,属于安全的线程操作,而StringBuilder类中的方法都属于异步方法,属于非线程安全的操作。
在开发之中,如果见到了字符串的应用,一般使用String类,只有在需要字符串频繁修改的时候才会考虑使用到StringBuffer或者是StringBuilder类操作。
总结
String类依然是最常用的字符串描述类,而StringBuffer类由于出现时间较长,所以使用要比StringBuilder多。