平常我自己写程序的时候,用到字符串第一反应总是String,然而Java类库里提供的字符串类却不仅仅是String,下面就来做个比较。在不清楚Java类库怎么用的时候最直接的就是百度,但百度到的往往也是个人做的解析,不够官方;官方点的就是看API文档了,就是有点费神;当然,还有最暴力的,看源码
String、StringBuffer 和StringBuilder 都在java.lang包中。
String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是 不可改变的,直至这个对象被销毁。API文档中是这样描述的
Class String
- java.lang.Object
-
- java.lang.String
-
- All Implemented Interfaces:
- Serializable , CharSequence , Comparable < String >
public final class String extends Object implements Serializable, Comparable<String>, CharSequence
String
类代表字符串。 Java程序中的所有字符串文字(例如"abc"
)都被实现为此类的实例。字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。 例如:
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
以下是一些如何使用字符串的示例:
System.out.println("abc"); String cde = "cde"; System.out.println("abc" + cde); String c = "abc".substring(2,3); String d = cde.substring(1, 2);
String
类包括用于检查序列的各个字符的方法,用于比较字符串,搜索字符串,提取子字符串以及创建将所有字符翻译为大写或小写的字符串的副本。 案例映射基于Character
类指定的Unicode标准版本。Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过
StringBuilder
(或StringBuffer
)类及其append
方法实现的。 字符串转换是通过方法来实现toString
,由下式定义Object
和继承由在Java中的所有类。 有关字符串连接和转换的其他信息,请参阅Gosling,Joy和Steele, Java语言规范 。除非另有说明,否则传递null参数到此类中的构造函数或方法将导致抛出
NullPointerException
。A
String
表示UTF-16格式的字符串,其中补充字符由代理对表示 (有关详细信息,请参阅Character课程中的Character
部分)。 索引值是指char
代码单元,所以补充字符在String中使用两个String
。String
类提供处理Unicode代码点(即字符)的方法,以及用于处理Unicode代码单元(即char
值)的方法。
StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer对象被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换成一个String对象。
Class StringBuffer
- java.lang.Object
-
- java.lang.StringBuffer
-
- All Implemented Interfaces:
- Serializable , Appendable , CharSequence
public final class StringBuffer extends Object implements Serializable, CharSequence
线程安全,可变的字符序列。 字符串缓冲区就像一个String
,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。
StringBuffer的主要
StringBuffer
是append
和insert
方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。append
方法总是在缓冲区的末尾添加这些字符;insert
方法将insert
添加到指定点。例如,如果
z
是指当前内容为"start"
的字符串缓冲区对象,那么方法调用z.append("le")
将使字符串缓冲区包含"startle"
,而z.insert(4, "le")
会将字符串缓冲区更改为包含"starlet"
。一般情况下,如果某人是指的一个实例
StringBuffer
,则sb.append(x)
具有相同的效果sb.insert(sb.length(), x)
。每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然
StringBuffer
被设计为可以安全地从多个线程并发使用,但如果构造函数或append
或insert
操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。
除非另有说明,否则将
null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
。从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程
StringBuilder
。StringBuilder
应该使用StringBuilder
类,因为它支持所有相同的操作,但它更快,因为它不执行同步。
StringBuilder类是JDK1.5新增的,它也代表字符串对象。StringBuilder 和StringBuffer 基本类似,不过StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。不考虑线程安全的情况下,要创建内容可变的字符串时应优先考虑使用StringBuilder。
Class StringBuilder
- java.lang.Object
-
- java.lang.StringBuilder
-
- All Implemented Interfaces:
- Serializable , Appendable , CharSequence
public final class StringBuilder extends Object implements Serializable, CharSequence
一个可变的字符序列。 此类提供与StringBuffer
的API,但不保证同步。 此类设计用作简易替换为StringBuffer
在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。 在可能的情况下,建议使用这个类别优先于StringBuffer
,因为它在大多数实现中将更快。StringBuilder的主要
StringBuilder
是append
和insert
方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。append
方法始终在构建器的末尾添加这些字符;insert
方法将insert
添加到指定点。例如,如果
z
引用当前内容为“start
”的字符串构建器对象,那么方法调用z.append("le")
将导致字符串构建器包含“startle
”,而z.insert(4, "le")
会将字符串构建器更改为包含“starlet
”。一般情况下,如果某人是指的一个实例
StringBuilder
,则sb.append(x)
具有相同的效果sb.insert(sb.length(), x)
。每个字符串构建器都有一个容量。 只要字符串构建器中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。 如果内部缓冲区溢出,则会自动变大。
StringBuilder的
StringBuilder
不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer
。除非另有说明,否则将
null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
。
API文档对应的JDK版本为1.8