借助JDK文档,选取String与StringBuffer、StringBuilder的常用API,并编写实例测试API的功能。
请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?
共同点:内部实现基于字符数组,封装了对字符串处理的各种操作;可自动检测数组越界等运行时异常。区别:String内部实现基于常量字符数组,内容不可变;StringBuffer、StringBuilder基于普通字符数组,数组大小可根据字符串的实际长度自动扩容,内容可变;性能方面,对于字符串的处理,相对来说效率:StringBuilder >StringBuffer>String;StringBuffer线程安全,StringBuilder非线程安全。使用场景:String:对安全要求更高;StringBuffer、StringBuilder:对性能要求更高。
为什么不建议在for循环中使用“+”进行字符串拼接?
常用的字符串拼接方式有五种,分别是+
、concat
、StringBuilder
、StringBuffer
以及StringUtils.join
。用时从短到长的对比:StringBuilder < StringBuffer < concat < + < StringUtils.join。由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。而“+”反编译后的代码,在for
循环中,每次都是new
了一个StringBuilder
,然后再把String
转成StringBuilder
,再进行append
。而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。因此,经过对比发现,直接使用StringBuilder
的方式是效率最高的。因为StringBuilder
天生就是设计来定义可变字符串和字符串的变化操作的。但是,还要强调的是:如果不是在循环体中进行字符串拼接的话,直接使用+
就好了;如果在并发场景中进行字符串拼接的话,要使用StringBuffer
来代替StringBuilder
。