1. String类
- String类是被final修饰的,所有String不能被继承。
- String类是不可变的,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。
String s = "Hello "; s.concat("World!"); //字符串连接 System.out.println(s); //输出s,还是"Hello " s = s.concat("World!"); //把字符串对象连接的结果赋给了s引用 System.out.println(s); //输出s,变成了"Hello World!"
上述三条语句其实产生了3个String对象,"Hello ","World!","Hello World!"。第2条语句确实产生了"Hello World"字符串,但是没有指定把该字符串的引用赋给谁,因此没有改变s引用。第3条语句根据不变性,并没有改变"Hello ",JVM创建了一个新的对象,把"Hello ","World!"的连接赋给了s引用,因此引用变了,但是原对象没变。
所以经常要改变字符串长度的话不要使用string,因为每次生成对象都会对系统性能产生影响,特别是当内存中引用的对象多了以后,JVM的GC就会开始工作,性能就会降低。
2. StringBuffer类
StringBuffer 类是可变的。它是 String 的对等类,它可以增加和编写字符的可变序列,并且能够将字符插入到字符串中间或附加到字符串末尾,使用StringBuffer类时,每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用,所以多数情况下推荐使用StringBuffer,特别是字符串对象经常要改变的情况。
StringBuffer类有关键词synchronized修饰,所有StringBuffer是线程安全的。
StringBuffer Sb = new StringBuilder(“I”);
sb.append("love");
sb.append("Java");
//整段代码只创建了一个StringBuffer对象
3. StringBuilder类
tringBuilder是5.0新增的,是为StringBuffer类补充的一个单线程的等价类。我们在使用时应优先考虑使用StringBuilder,因为它支持StringBuffer的所有操作,但是因为它没有synchronized关键词修饰,不会有线程安全带来额外的系统消耗,所以速度更快。同样也是线程不安全的