面试题答案
一键面试性能不同点及原因
- String:
- 性能:性能最差。
- 原因:String类是不可变类,每次对String进行拼接操作,都会创建一个新的String对象,原来的String对象会成为垃圾对象等待垃圾回收。例如
String s = "a" + "b"
,实际上会创建三个对象,"a","b" 以及拼接后的 "ab"。随着拼接次数增多,会频繁创建和销毁对象,消耗大量内存和时间。
- StringBuffer:
- 性能:性能较好。
- 原因:StringBuffer是可变类,它有一个内部的字符数组来存储字符串内容。在进行拼接操作时,直接在内部数组上进行修改,不会像String那样频繁创建新对象。它的方法是线程安全的,在多线程环境下调用其方法时,会使用
synchronized
关键字进行同步,这在一定程度上会影响性能。
- StringBuilder:
- 性能:性能最好。
- 原因:StringBuilder同样是可变类,内部实现和StringBuffer类似,也是通过字符数组存储字符串内容。但它的方法不是线程安全的,没有
synchronized
关键字的开销,在单线程环境下性能比StringBuffer更优。
拼接1000个字符串的选择及原因
- 选择:从性能角度考虑,在单线程环境下会选择
StringBuilder
;如果是多线程环境则选择StringBuffer
。 - 原因:单线程环境中,
StringBuilder
没有线程同步的开销,在频繁拼接操作时,相比StringBuffer
能更高效地完成任务。而在多线程环境下,StringBuffer
的线程安全特性可以保证字符串拼接操作的正确性,虽然有同步开销,但能避免多线程并发访问导致的数据不一致问题,而StringBuilder
在多线程环境下使用会出现数据竞争等问题。