在Java中,假设存在如下代码片段:`String str1 = "abc"; String str2 = new String("abc"); String str3 = "ab" + "c";`,关于这些字符串对象,下列哪个断言是正确的?
答案解析
字符串常量在编译时会被放入字符串常量池。`String str1 = "abc";` 直接使用字面量,会在常量池中查找是否存在"abc",如果不存在则创建,并把引用赋给str1。`String str2 = new String("abc");` 使用new关键字创建了一个新的String对象,这个对象在堆内存中,并不会在常量池中查找。因此str1和str2引用的是不同的对象,`str1 == str2` 为false。 `String str3 = "ab" + "c";` 字符串常量拼接在编译时会进行优化,直接生成 "abc" 放入常量池,所以 str3 也指向常量池中的"abc",与str1指向同一个对象。因此 `str1 == str3` 为true。而 `equals` 方法比较的是字符串的内容,而非引用,所以 `str1.equals(str2)` 和 `str1.equals(str3)` 都为true。选项A错误,因为 `str1 == str2` 为false。选项C错误,`str1.equals(str2)` 为true。选项D错误,因为`str1 == str3` 为true。
正确答案:B