- 从String类说起
- StringBuilder
- StringBuffer
从String说起
String是java定义的一个final类,不能被继承。也是我们日常生活中最常见到的类之一,可以实现对字符串的各种操作,但是但是他的对象不可变这个特性在某些情况下会带来很大的性能问题
看下面的一个过程:字符串的拼接
String str="";
for(int i=0;i<100;i++){
str+="hello";
}
关于字符串的拼接是一个很常见的操作,如果在我们的开发中有类似上述的过程需要多次拼接字符串,由于字符串不可变,每次拼接将会创建一个新的对象,所以此过程最少会新创建100的对象,这将会给我们程序的性能带来致命的影响
StringBuilder类
为了解决类似场景的问题,java提供了StringBuilder类
可以把该类看成是一个容器,其最大的特点是里面的内容(对象)是可变的,表现为每次进行操作后返回的是同一个StringBuilder对象,而不会像String一样新创建一个对象,这样就解决了字符串大量拼接情景下所带来的性能问题
-
下面的图可以直观的看出来进行一系列操作后没有创建新的对象返回的是同一个对象
-
常用方法的举例
package Test;
//测试StringBuilder类的常用方法
public class StringBuilderTest {
public static void main(String[] args) {
//空参构造方法
StringBuffer sb1=new StringBuffer();//容器里什么也没放
//单参构造
StringBuilder sb2=new StringBuilder("hello");//容器里面放了hello
System.out.println(sb2);//hello
//追加
StringBuilder sb3=new StringBuilder();
sb3.append("hello").append(123).append('c').append(23.4);//append重载多种类型
System.out.println(sb3);//hello123c23.4
//反转
StringBuilder sb4=new StringBuilder("hello world");
sb4.reverse();
System.out.println(sb4);//dlrow olleh
//toString
//将StringBuilder 转化成字符串进行输出
}
}
- StringBuilder方法特点
1.带有对象可变特性
2.大多数方法和String的方法名相同
2.很多方法都进行了大量的重载支持所有数据类型的处理
StringBuffer类
StringBuffer类的方法和用法和StringBuilder类相同,但在相同的情况下StringBuffer的运行速度更快
StringBuilder和StringBuffer的不同
通过查看StringBuffer的源码可以发现,他的所有操作方法都使用了synchronized关键字修饰,说明StringBuffer采用了线程同步处理机制,而StringBuilder类并没有这样处理,说明StringBuilder是线程不安全的,而StringBuffer是线程安全的
推荐使用建议
API文档(对StringBuilder的解释): 此类设计用作StringBuffer替代品,用于单个线程使用字符串缓冲区的位置(通常情况下)。 在可能的情况下,建议使用此类优先于StringBuffer因为在大多数实现中它会更快。
1.在进行较少的操作时建议使用String类,操作简单
2.在其余情况下建议使用StringBuffer类,比StringBuilder更安全还更快(上文说的哪一种情况除外)