String、StringBuffer 和 StringBuilder 的区别

String

字符串常量,字符串内容和长度都是不可变的。定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
/**
* ...
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* ...
*/
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
...
}

String 的操作都是在堆内存中重新申请一块内存区并赋值,最终返回该存储区首地址给引用变量。所以如果频繁修改 String 会产生堆内存垃圾,直到 java 触发内存管理机制才能释放。所以在形参传递时, String 类似值传递。

StringBuffer

字符串变量,同时也是线程安全的(Synchronized)。

StringBuilder

字符串变量,但不是线程安全的。

使用策略

  • String :操作少量的数据
  • StringBuilder:单线程操作大量数据
  • StringBuffer :多线程操作大量数据

不要使用 String 类进行频繁的字符串拼接或插入删除,因为那样的性能较差,应该使用 StringBufferStringBuilder 类,这在 Java 的优化上是一条比较重要的原则。执行速度上:String < StringBuffer < Stringbuilder

0%