黑马程序员:Java培训、Android培训、iOS培训、.Net培训

Stirng、StringBuffer和StringBuilder都实现了字符序列接口CharSequence,都是final类。

一、Stirng、StringBuffer和StringBuilder

    (1) 三者都可以存储和操作字符串。

   (2)String提供了数值不可改变的字符串,而StringBuffer和StringBuilder是可改变的。

   (3)操作String对象是,可能会额外产生许多临时变量,而StringBuffer和StringBuilder不会。

   (4)String实现了equals()方法,而StringBuffer和StringBuilder没有。即new String(“abc”).equals(new String(“abc”))的结果为ture;而new StringBuffer(“abc”).equals(new StringBuffer(“abc”))的结果为false.。

   (5)StringBuffer实现了线程安全,而StringBuilder没有。但,在单线程下,StringBuilder的性能比StringBuffer好。所以,……..

 

二、String的变与不变

    1、String不变:是指String对象的内容是不可变的,一旦试图去修改String对象的内容,计算机就会创建新的String对象(开辟新的内存空间)存放新的结果,同时指向原先String对象的String变量会指向新的String对象。即String对象是不可变的,但String变量可改变其所指向。

    2、String的特别案例

      (1)有如下代码:

                 String a = new String(“123”);

                 String b = new String(“123”);

          请问:a与b指向的是同一个对象吗………

          答案:a与b指向的是不同的对象,计算机为相同的字符串常量开辟不同的空间。

      (2)有如下代码:

                 String a = “123”;

                 String b = “123”;

          请问:a与b指向的是同一个对象吗………

          答案:a与b指向的是同一个对象,计算机只为相同的字符串常量开辟一份空间

      (3)有如下代码:

                 String a = “123” + “”;

                 String b = “123” + “”;

          请问:a与b指向的是同一个对象吗………

          答案:a与b指向的是同一个对象,编译器对上述代码进行优化(“123” + “”与“123”等价)

三、正确使用Stirng、StringBuffer和StringBuilder

    1、字符串连接,不应该使用String,而应首选使用StringBuilder,如果要求线程安全,则选用StringBuffer。

    2、使用StringBuilder和StringBuffer时,要为它们配置初始容量(尽管需要计算)。

3、通过StringBuilder和StringBuffer的toString()方法,返回一个String对象。

4、数字转换为字符串时,不是使用包装器的toString(),而应当使用String.valueOf(…)