给定以下Java代码片段: ```java String str1 = new String("abc"); String str2 = "abc"; String str3 = new String("abc"); ``` 下列关于`str1`,`str2`和`str3`的比较结果,哪个是正确的?
答案解析
核心考点:字符串对象的创建和比较,`==` 和 `equals()` 的区别。
解题思路分析:`String` 类是特殊的引用类型。使用 `new String()` 创建的对象会在堆内存中分配新的空间,而字面量形式创建的字符串,如果字符串常量池中已存在,则会直接引用池中的对象。`==` 比较的是对象的引用(内存地址),而 `equals()` 比较的是对象的内容。`str1` 和 `str3` 使用 `new` 创建,引用不同,而`str2` 使用字面量创建,如果常量池中已经存在字面量为abc的String对象,则直接引用该对象。
选项A分析:`str1` 和 `str2` 引用不同,所以 `str1 == str2` 为 `false`,`str1` 和 `str3` 引用不同,所以 `str1==str3` 为 `false`,所以A错误。
选项B分析:`str1 == str2` 是 `false` 正确,`str1.equals(str3)` 比较的是字符串的内容,内容相同,返回true,所以B错误。
选项C分析:`str1 == str2` 是 `false` 正确,`str1.equals(str3)` 比较的是字符串的内容,内容相同,返回 `true`,所以C正确。
选项D分析:`str1.equals(str2)` 是 `true` ,`str1 == str3`是`false`,D错误。
易错点提醒:`==` 比较引用, `equals()` 比较内容。字面量创建的字符串会从常量池中寻找是否已存在,存在则引用,不存在则创建。
正确答案:C