关于B选项:在现在的JDK版本中,编译器会对"abc"+"def"这类字符串进行优化,在编译完毕后,它们会被合并为"abcdef",故不存在三个对象。后面那一句:在 Java 中对字符串的一切操作,都会产生一个新的字符串对象,对于String类来说,可以认为是正确的。
关于C选项和D选项:(摘自String、StringBuffer和StringBuilder类的区别 (biancheng.net))StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
操作少量的数据使用 String。单线程操作大量数据使用 StringBuilder。多线程操作大量数据使用 StringBuffer。