1 String
String
是字符串常量,由final修饰,不可变,即一旦一个 String 对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。由于String是不可变的,自然就不存在线程安全问题。
String
对象在进行字符串拼接时,因为字符串的不可变性,String
对象会每次拼接,都会复制一个副本出来进行运算,而本身的串仍然留在内存中,大量的临时片段会造成不可忽视的性能损耗。所以在进行大量的字符串拼接时建议使用 StringBuilder
或 StringBuffer
。
2 StringBuilder & StringBuffer
StringBuffer
类则代表一个字符序列可变的字符串,可以通过 append、insert、reverse、setChartAt、setLength
等方法改变其内容。一旦生成了最终的字符串,调用 toString
方法将其转变为 String
。JDK1.5 新增了一个 StringBuilder 类,两者的区别是:
StringBuffer
与StringBuilder
中的方法和功能完全是等价的。- 只是
StringBuffer
中的方法大都采用了synchronized
关键字进行修饰,因此是线程安全的,而StringBuilder
没有这个修饰,可以被认为是线程不安全的。 - 在单线程程序下,
StringBuilder
效率更高,因为它不需要加锁,不具备多线程安全而StringBuffer
则每次都需要判断锁,效率相对更低。
3 总结
String | StringBuffer | StringBuilder | |
---|---|---|---|
执行速度 | 慢 | 中 | 快 |
线程安全 | 是 | 是 | 否 |
使用场景 | 少量字符串操作 | 多线程环境下的大量操作 | 单线程环境下的大量操作 |