java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在我们来看一下它们各自的内容:
一、String类型的拼接
String的concat方法只会返回拼接括号内数据后的字符串,但是这个String类型的本身并不受影响。
这里的拼接符不能所在的表达式不能单独存在,必须有赋值操作。
二、StringBuffer类型的拼接
可以看到,只要运用的append或insert方法,那么StringBuffer本身的值就会改变,而不用重新赋值。
三、StringBuilder类型的拼接
StringBuilder比StringBuffer运行速度要快,因为StringBuilder是针对于单线程的,所这它是非线程安全的。普通情况下建议使用StringBuilder。
使用场景
使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。
对于三者使用的总结:
1.如果要操作少量的数据用=String
2.单线程操作字符串缓冲区下操作大量数据=StringBuilder
3.多线程操作字符串缓冲区下操作大量数据=StringBuffer
假如我们用StringBuffer/StringBuilder对字符串进行拼接,有时我们会犯哪些错误呢?下面小编给大家看一个错误案例:
错误案例
在循环中大量使用字符串连接,会导致不必要的内存消耗和频繁的垃圾回收。
错误分析
错误的写法:
能用”+”或”+=”操作符来拼接大量字符串,在大量字符串拼接操作时,直接相加两个String对象,会为新创建的字符串分配内存,原有的两个String对象也没有释放掉,从而消耗大量的内存资源。
在我们这种高访问量的网站中,一些微小的问题也可能被无限放大,成为严重影响系统性能的瓶颈。
正确用法
测试关注点
通过持续的压力测试,看内存占用的增长情况
小编结语:
更多内容尽在课课家教育!