String(字符串常量)
Java将String类对象称为不可变字符串,String类的声明是publc final
,String类没有提供用于修改字符串的方法。举例:
以上为修改greeting
的方法,只能通过让它引用另一个字符串的方式修改其内容。一旦要求改变字符串的值,就会开辟新的内存空间来保存新字符串,效率较低。
不可变字符串有一个优点:编译器让字符串共享。各种字符串放在公共的存储池中,字符串变量指向存储池中的位置。Java设计者认为共享的效率远高于字符串拼接的效率。
StringBuilder(字符串变量:非线程安全)
在JDK5.0中引人StringBuilder,前身是StringBuffer,适合在单线程中使用。
通过较短的字符串构建字符串时,若采用字符串拼接的方法效率较低,每次拼接都会产生一个新String对象。使用StringBuilder可以避免此类现象。举例:
通过构建StringBuilder对象来添加内容,最后调用toString()
方法得到一个String对象。
StringBuffer(字符串变量:线程安全)
Java.lang.StringBuffer线程安全的可变字符序列,使用方法类似StringBuilder,效率略低,因为内部维护了同步锁。
主要操作是append
和insert
方法。append
方法将字符添加到缓冲区的末端;而insert
方法则在指定的位置添加字符。
总结
对于经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开始工作,性能就会降低。
- 不要使用
+
来频繁拼接String对象,效率极低,应该使用StringBuilder或者StringBuffer - 构造StringBuilder或者StringBuffer时最好指定容量,默认容量是16
- StringBuilder用于局部,StringBuffer用于全局
- String可以理解为常量,不可变字符串
- StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
- 如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer