在 Java 语言中,对于字符串操作中,String、Stringbuffer、StringBuilder 占据了必不可少的地位。那它们之间具体有什么区别呢?(对于一些入门程序猿来说,字符串处理似乎只用到了 String)。

首先我们从性能上来对比这三个类。再大量改变字符串时 StringBuilder > Stringbuffer > String。为什么会出现这样的性能差呢,我们可以通过它们的本质来理解这样的性能差异。

String类是字符串常量。何为常量?就是一旦初始化后就是不可改变的对象。举个例子:

//初始化 test 字符串
        String test="This is";
        //在 test 字符串后添加字符串再赋值给 test 对象
        test=test+"a test";



在这个例子中,第一句代码 JVM 会创建一个 test 对象并赋值,而第二行代码中, JVM 会创建一个新的 test 对象,并将原有字符串加上增加部分的字符创赋值给新的 test 对象。这会给人一种错觉,明明我操作的是同一个对象 test 为什么会创建出一个新的对象。其实这就是因为 String 对象是字符常量,不可变对象。所以在对它进行改变时 JVM 执行 new String()方法来重新创建一个内存地址来保存新的字符串。

StringBuffer类是字符串变量(线程安全)。它是一个可以改变的对象,使用它在对字符串进行操作时,JVM 不会创建一个新的内存地址(字符串缓存区)来指向改变后的字符串,而是在原有的字符串缓存区对字符串的长度及内容进行改变。这样的操作显而易见比 String 的创建新的对象要高效许多。

StringBuilder类基本功能与StringBuffer  一致,使用方法也没什么区别。它们的区别是 StringBuilder 是线程非安全的。当我们的字符串缓存区被对个线程使用时它不能保证操作的正确性。但是在单线程使用时它的速度无疑是最快的。