String StringBuffer StringBuilder区别和使用
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。
推荐阅读
-
String StringBuffer StringBuilder区别和使用
-
String、StringBuffer、StringBuilder的区别及使用
-
String、StringBuffer与StringBuilder
-
String StringBuilder StringBuffer 的使用
-
String,StringBuffer,StringBuilder
-
String StringBuffer StringBuilder
-
记一次MySql单列索引和联合索引的使用区别
-
Java中API下的String,StringBuffer,StringBuilder的区别及用法
-
String,StringBuilder,StringBuffer
-
PHP函数addslashes和mysql_real_escape_string的区别_PHP教程