首页 > 代码库 > 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三者的区别