简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?
共同点:
1.内部实现基于字符数组,封装了对字符串处理的各种操作
2.可自动检测数组越界等运行时异常
不同点:
1.String内部实现基于常量字符数组,内容不可变;
StringBuffer、StringBuilder基于普通字符数组,数组大小可根据字符串的实际长度自动扩容,内容可变
2.性能方面,对于字符串的处理,相对来说 StringBuilder > StringBuffer > String
3.StringBuffer线程安全;StringBuilder非线程安全
应用场景:
String类:
在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
StringBuffer类:
在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
StringBuilder类:
在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,例如SQL语句的拼装、JSON封装等。
为什么不建议在for循环中使用“+”进行字符串拼接?
在反编译后的代码中,for循环中的“+”操作,是每次都new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。
频繁的新建对象要耗费很多时间,不仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费,大大降低了效率。所以,在循环体内,字符串的连接方式,一般建议使用 StringBuilder 的 append 方法进行扩展。而不是使用“+”进行拼接。