文章目录
1. String类
在Java中,字符串被作为String类型的对象来处理。String类位于java.lang包中,默认情况下被自动全部导入。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
......
}
String类被称为不可变字符序列,原因就是它的底层是由final修饰的字符数组存储的,所以每次重新赋值只是新建了一个对象之后将原来的引用指向它,这样会产生大量的内存垃圾。
2. StringBuffer类(线程安全)
StringBuffer类也是Java提供的用于处理字符串的一个类,比String类更高效,特别是对字符串进行连接操作时,使用StringBuffer类可以大大提高程序的执行效率。声明StringBuffer对象并初始化:
StringBuffer s = new StringBuffer("xingze");
2.1 StringBuffer线程安全的原因
StringBuffer是线程安全的,因为它的源码中的方法大多数都被synchronized
修饰了。如下:
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
3. StringBuilder类
StringBuilder类提供了与StringBuffer类兼容的API,被设计用作StringBuffer的一个简易替换,在单线程环境下,它比StringBuffer类要快。但是在多线程环境下StringBuilder是线程不安全的。使用StringBuilder类处理字符串的方法与StringBuffer类基本一样。
StringBuilder继承了AbstractStringBuilder类:
public final class StringBuilder
extends AbstractStringBuilder
AbstractStringBuilder定义了String的存储方式(非final类型的字符数组):
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
.......
}
4. String、StringBuffer、StringBuilder比较
(1)String:字符串常量
String是不可变的对象,在每次对String类型进行改变时其实都等同于生成了一个新的String对象,然后指向新的String对象,所以经常改变内容的字符串最好不用String类型,会对系统性能产生影响(提前触发Full GC)。
(2)StringBuffer:字符串变量
StringBuffer是可变的字符串,在每次对StringBuffer对象进行操作时,会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象的引用。所以,在字符串对象经常改变的情况下推荐使用StringBuffer类
(3)StringBuilder:字符串变量
StringBuilder类是JDK1.5以后提供的,它和StringBuilder类等价,区别在于StringBuffer类通过synchronized
实现了线程安全,而StringBuilder类是单线程的,没有提供同步,单线程环境下效率更高。