首页 > 代码库 > String、StringBuffer与StringBuilder三者的区别

String、StringBuffer与StringBuilder三者的区别

简单的说:

String:创建的是字符串常量,创建的字符串会放入内存的常量池中,是不可变的对象。如果要对String类型的内容进行改变,实际上每次改变都会重新new一个String类型的字符串对象,指针指向的地址已经发生改变。如果要经常改变字符串的内容时,不建议使用String类型的字符串,因为每次创建新的字符串对象都会对系统造成影响。

StringBuffer:创建字符串,当要改变内容时是对其本身进行修改,并不会创建新的对象。该方法线程安全。

StringBuilder:创建字符串,当要改变内容时是对其本身进行修改,并不会创建新的对象。该方法线程不安全。

深入谈论:

我们以StringBuffer为例

当我们创建一个StringBuffer对象时,

StringBuffer sb = new StringBuffer();实际上是创建了一个初始长度为16的字符数组。如下图

技术分享

技术分享

我们也可以这样创建

StringBuffer sb = new StringBuffer("abcd"),我们这时得到的初始长度为str.length()+16,字符数组为:{‘a‘,‘b‘,‘c‘,‘d‘,\u0000,\u0000.......}

技术分享

整个字符串创建修改的过程为:

1 public static void main(String[] args){
2         StringBuffer sb = new StringBuffer();
3         sb.append("You ").append("are ").append("my ").append("world");
4         System.out.println(sb);
5     }

这里我们发散一下,我们append添加新的字符串后的长度超过了初始长度我们接下来怎么去做?

源码提供了一种方法:在老数组上创建一个新的数组,新数组长度为value.length*2+2

技术分享

public static void main(String[] args){
        StringBuffer sb = new StringBuffer();
        for (int i=0;i<1000;i++){
            sb.append(i);
        }
        System.out.println(sb);
    }

  Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
  可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
  StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

  StirngBuffer与StringBuilder方法基本一致。用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

 

String、StringBuffer与StringBuilder三者的区别