面试题答案
一键面试1. 字符串常量操作
- 选择:
String
- 原因:
String
类是不可变的,一旦创建,其值就不能被修改。对于字符串常量,它们在程序运行期间不会改变,使用String
能保证数据的一致性和安全性,并且String
对象可以在字符串常量池中共享,节省内存空间。 - 避免性能瓶颈:由于
String
不可变,所以每次修改操作(如拼接等)都会创建新的String
对象。但对于常量操作,这不是性能瓶颈,因为常量一般数量有限且操作频率低。
2. 多线程环境下对字符串的频繁修改操作
- 选择:
StringBuffer
- 原因:
StringBuffer
是线程安全的,它的所有方法都使用synchronized
关键字修饰。在多线程环境下,多个线程可能同时对字符串进行修改操作,使用StringBuffer
可以避免数据不一致的问题。 - 避免性能瓶颈:虽然
StringBuffer
保证了线程安全,但synchronized
关键字会带来一定的性能开销。因此,要尽量减少不必要的同步块嵌套,合理安排线程对StringBuffer
的操作顺序,避免线程长时间等待锁资源。
3. 单线程下的大量字符串拼接操作
- 选择:
StringBuilder
- 原因:
StringBuilder
是非线程安全的,它在性能上比StringBuffer
更好,因为它没有使用synchronized
关键字。在单线程环境下,不存在线程安全问题,所以使用StringBuilder
能获得更高的性能。 - 避免性能瓶颈:
StringBuilder
有一个容量的概念,如果预先知道要拼接的大致长度,可以通过构造函数指定初始容量,避免在拼接过程中频繁的扩容操作,因为扩容操作会涉及到数组的复制,性能开销较大。例如StringBuilder sb = new StringBuilder(100);
提前设置合适容量。