JAVA---String、StringBuffer和StringBuilder的区别

String

String:字符串常量,字符串长度不可变。

StringBuffer

StringBuffer:字符串变量(synchronize,即线程安全)。

使用前调用java.lang.StringBuffer

StringBuffer的主要操作:append()和insert()方法,可重载方法以便接收任意类型的数据。

  • append: 始终将这些字符添加到缓冲区末端;
  • insert:在指定位置添加字符。

每个方法都能有效将给定数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。

例如:

  StringBuffer sb = new StringBuffer("test");
  sb.append("abc");
  sb.insert(2,"ab");

结果图为:

StringBuilder(JDK 5.0)

StringBuilder:字符串变量(线程不安全)。

  • 使用前需调用java.lang.StringBuilder

  • 该类被当做StringBuffer 的一个简易替换,用在字符串缓冲区被单线程使用的时候(这种情况很普遍)。

  • 其构造方法有:

构造方法 描述
StringBuilder() 创建一个容量为16的StringBuffer对象(16个空元素)
StringBuilder(CharSequence cs) 创建一个包含cs的StringBuilder对象,末尾附加16个空元素
StringBuilder(int initCapacity) 创建一个容量为initCapacity的StringBuilder对象
StringBuilder(String s) 创建一个包含s的StringBuilder对象,末尾附加16个空元素
  • 在大多数情况下,StringBuilder > StringBuffer,这是因为前者不需要考虑线程安全。

三者区别:

  • String和StringBuffer的主要性能区别:
  1. String是不可变的对象,所以每当对String类型进行修改时,都会先生成一个新对象,然后再将指针指向新对象。

所以经常改变内容的字符串最好不要用String,因为每次生成新对象都会影响系统性能,特别当无引用对象多了后,JVM的GC就会开始工作,性能就会降低。

  1. 而StringBuffer修改时是直接对原对象进行操作,所以多数情况推荐StringBuffer ,特别是经常修改字符串的时候。

  2. 生成String类并不比StringBuffer慢。是因为其实在JAVA Compiler里,自动做了转换:

原:String s1 = “This is only a” + “ simple” + “ test”;
-> String s1 = “This is only a simple test”;  

所以速度很快,但如果拼接来自多个String对象时,就不会自动转换,速度也没那么快了。

如:
String s2 = “This is only a”;  
String s3 = “ simple”;  
String s4 = “ test”;  
String s1 = s2 + s3 + s4;  

总结

  • 如果操作少量数据,用String。单线程操作大量数据,则用StringBilder;多线程操作大量数据,用StringBuffer。
  • 不要用String类的“+”进行频繁拼接,性能极差。
    如:
String result = "";
for (String s : hugeArray) {
    result = result + s;
}

// 使用StringBuilder
StringBuilder sb = new StringBuilder();
for (String s : hugeArray) {
    sb.append(s);
}
String result = sb.toString();
  • 为了高性能,在用StringBuffer和StringBuilder应尽可能指定容量。当然,如果操作符不超过16个就不需要了。但是不指定时默认会构造一个16容量的对象,显然降低了性能。

  • StringBuilder一般在方法内部实现类似“+”的功能,因为线程不安全,所以用完即弃。StringBuffer主要用在全局变量中。

  • 虽然StringBuilder相比StringBuffer能提升10%~15%的性能,但是要冒多线程不安全的风险。而在现实中的模块编程,由于负责某一模块的程序员不一定能判断出该模块是否运行于多线程环境下,所以:除非确定系统的瓶颈在StringBuffer上,并且确定你的模块不会运行于多线程模式下,才可以使用StringBuilder;否则还是用StringBuffer。

本文摘自runoob网,主要用于知识点总结,若要查看详细
请点此

posted @ 2020-11-19 11:27  acchris  阅读(85)  评论(0)    收藏  举报