Java知识梳理之String与Stringbuffer与StringBuilder之间的区别

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关键词修饰,不会有线程安全带来额外的系统消耗,所以速度更快。同样也是线程不安全的

 

你可能感兴趣的:(JavaSE)