欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

String StringBuffer StringBuilder区别和使用

程序员文章站 2024-01-20 22:32:10
...

1. String

        首先在Java里,string类是不可变的,该类没有提供修改字符串的方法,在对字符串进行拼接剪裁更改操作时,会不断申请新的地址来存储操作后的字符串,而原字符串被JVM的垃圾回收机制(GC)给回收掉了。在这里需要注意的是,不是String类型的变量不可变,是string数据内容是不可修改的。当内容修改时,只是String变量指向的字符串地址改变了。

        java为什么不推荐用+ 来拼接字符串? 因为Stirng是不可变类,每次拼接都会产生大量无用的中间对象,耗费空间而且效率低下。 新建、回收这些多余的对象会额外花费很多时间。 

      既然将String类设计成不可变的会增加很多新建和回收的过程,降低效率,问什么还要这样设计呢?因为设计者设计了字符串共享池的概念,大概意思就是字符串存储在一个公共的共享池里,很多对象可以指向同一位置,而不需要重新创建。如果你想复制一个已有的字符串,只需要将地址指向该字符串在共享池里的地址就可以,这样节省的效率会远高于字符串改变时新建回收时浪费的效率。

      关于String类的API可以参考这篇博客:https://blog.csdn.net/qq_42320048/article/details/87544831

2.StringBuffer

StringBuffer对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。StringBuffer是线程安全的在多线程的情况建议使用StringBuffer

使用实例:

public class Test{
  public static void main(String args[]){
    StringBuffer sBuffer = new StringBuffer("abc");
    sBuffer.append("123");
    sBuffer.append("&&&&");
    sBuffer.append("kkk");
    System.out.println(sBuffer);  
  }
}

 

3.StringBuilder

StringBuilder 类和StringBuffer一样,也是直接对对象的修改,操作过程中不会产生新的未使用的对象。它在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法是线程不安全的(不能同步访问),所以 StringBuilder 相较于 StringBuffer 有速度优势,所以在单线程的情况下建议使用 StringBuilder 类

使用实例:

String str1="abc";
String str2="de";
StringBuilder stringBuilder=new StringBuilder().append(str1).append(str2);
System.out.println(stringBuilder.toString());

4.总结

速度:StringBuilder > StringBuffer > String

使用原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。