1.String,StringBuilder,StringBuffer本质
在java中,字符串的本至其实是字符组成的数组,反应在String,StringBuilder,StringBuffer类中就是value[]属性。通过jdk源码我们会发现
Stirng类的value[]是private final char value[]; 说明String是不可编辑字符序列。
StringBuffer与StringBuilder继承抽象类AbstractStringBuilder,其value[]属性没有final关键字修饰,所以其属性可以通过append()方法修改,是可变编辑序列
2.String,StringBuilder,StringBuffer效率
在效率方面StringBuilder > StringBuffer > String
举个最简单的字符串拼接的例子:
String str = "String测试";
StringBuilder sb = new StringBuilder("SB测试");
for(int i=0;i<3;i++) {
str+=i;
sb.append(i);
}
String类运行的内存分析如下图:
从上图中我们不难发现,在整个程序的运行过程中,String一共新建了三个对象。
而StringBuilder因为是可变的,每调用一次append方法,都会返回一个this对象,即返回对象本身。故整个程序运行中,只存在一个StringBuilder对象。
综上,StringBuilder的效率>String的效率。
StringBuffer本质与StringBuilder差不多,只是StringBuffer中的方法加了synchronized关键字,所以StringBuffer是线程安全的,但是效率比StringBuilder低。