java.lang
类 StringBuilder
java.lang.Objectjava.lang.StringBuilder
-
所有已实现的接口:
- Serializable, Appendable, CharSequence
public final class StringBuilder extends Object implements Serializable, CharSequence
一个可变的字符序列。此类提供一个与 StringBuffer
兼容的 API,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer
要快。
在 StringBuilder
上的主要操作是append
和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append
方法始终将这些字符添加到生成器的末端;而insert
方法则在指定的点添加字符。
例如,如果 z
引用一个当前内容为 "start
" 的字符串的生成器对象,则该方法调用 z.append("le")
将使字符串生成器包含 "startle
",而z.insert(4, "le")
将更改字符串生成器,使之包含 "starlet
"。
通常,如果 sb 引用 StringBuilder
的实例,则 sb.append(x)
和 sb.insert(sb.length(), x)
具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。
将 StringBuilder
的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer
。
先看下面的这个例子,读懂这个例子,你就理解了。
publicclass Test {
publicstaticvoid stringReplace (String text) {
text = text.replace('j' , 'i');
}
publicstaticvoid bufferReplace (StringBuffer text) {
text = text.append("C");
}
publicstaticvoid main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
答案是 javajavaC
这是String参数传递,是不可变的(immutable).
而题目中第七行text = text.append (“C”),append方法会改变text中的值
而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。
string的值永远不会改变!
String a = "a";//假设a指向地址0x0001,
a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址
StringBuffer则不同,直接改变指向的地址中保留的值
还有
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的,所以等于false.
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
true。
对于这样能不能面试出真正的水平,感到怀疑。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
String str=new String("HELLO");
String str="HELLO";
以上的区别请说明以下
String str=new String("HELLO");创建了两个对象,一个是"HELLO",然后再用"HELLO"创建一个str引用的对象.
下面的就在创建"HELLO"之后把str指向"HELLO",这样只创建了一个String的实例
~~~~~~~~~~~~~~~~~~~~~~~~~
因此得到的结论是:如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好了!
也许这就是你的程序的性能瓶颈!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
非可变对象一旦创建之后就不能再被改变,可变对象则可以在创建之后被改变。
String对象是非可变对象,StringBuffer对象则是可变对象。
为获得更佳的性能你需要根据实际情况小心谨慎地选择到底使用这两者中的某一个