最近刷题过程中频繁使用到了String类型,所以在此浅谈String,StringBuffer,StringBuffer三者的区别。
String简介
(1)String处于java.lang.String中,它已经实现的接口有Serializable, CharSequence, Comparable<String>
(2)在java中String
类代表字符串,Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。
(3)字符串是常量,它的值一经创建则不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
(4)在String中若使用“+”来改变字符串的内容,其实是重新创建了一个String常量,把改变的新字符串赋值给新常量。
StringBuffer简介
(1)StringBuffer处于java.lang.StringBuffer中,已实现的接口有Serializable, Appendable, CharSequence。
(2)是线程安全的可变字符序列。一个类似于 String
的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
(3)可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
(4)StringBuffer
上的主要操作是 append
和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串缓冲区中。append
方法始终将这些字符添加到缓冲区的末端;而 insert
方法则在指定的点添加字符。
(5)每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder
。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
StringBuilder简介
(1)StringBuilder处于java.lang.Stringbuilder中,已实现的接口有Serializable, Appendable, CharSequence。
(2)一个可变的字符序列。此类提供一个与 StringBuffer
兼容的 API,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer
要快。
(3)在 StringBuilder
上的主要操作是 append
和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append
方法始终将这些字符添加到生成器的末端;而 insert
方法则在指定的点添加字符。
(4)将 StringBuilder
的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer
。
区别:
String:常量,不可变
StringBuffer:线程安全,多线程
StringBuilder:线程不安全,单线程
执行效率:StringBuilder > StringBuilder > String(相对而言,并不是所有情况都这样)