java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,具体说原理的话,我们可以用两个例子来说明两种背景下的情况。
变量相加
-
案例走起,运算str1、str2和str3的拼接
-
直接相加实际运行,实际效果:
StringBuilder sb1 = new StringBuilder(str1);
sb1.append(str2);
String str = sb1.toString();
StringBuilder sb2 = new StringBuilder(str);
sb2.append(str3);
str = sb2.toString(); -
使用StringBuffer拼接,实际效果:
synchronized(this){
StringBuffer sb = new StringBuffer(str1);
sb.append(str2);
sb.append(str3);
str = sb.toString();
} -
使用StringBuiler拼接,实际效果:
StringBuilersb = new StringBuiler(str1);
sb.append(str2);
sb.append(str3);
str = sb.toString();
执行到最后,我们所需要的内容只有str这一个对象,中间出现的sb*就成为了垃圾回收的目标,所以总结来看,运行效率String < StringBuffer < StringBuiler,但是StringBuiler是线程不安全的。
总结一下,不难得出使用场景
- 使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
- 使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
- 使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。
产量相加
如果我们用1万个变量相加,能明显的对比出性能差别,但是当我们做常量相加的时候,那么我们就会发现一个有趣的现象,String的效率最高,这是因为我们的Java8以后做了很大的性能优化,编译器会把这一类的运算转化为最高效的StringBuiler来计算,但是明显String的写法来的更简单、直接、高效。
总结一下
- 在进行字符串变量拼接的时候最好是使用StringBuilder,毕竟我们几乎不会遇到多线程字符串拼接
- 在进行字符串常量拼接的时候,直接String走起