16. String str="i"与 String str=new String(“i”)一样吗?
大约 2 分钟
String str = "i";
和 String str = new String("i");
是两种不同的字符串创建方式,它们的行为和结果有所不同。以下是它们的区别:
1. String str = "i";
字符串常量池
:
- 当使用字面量形式(
"i"
)创建字符串时,Java会首先检查字符串常量池中是否已经存在内容相同的字符串对象。如果存在,就直接返回该对象的引用;如果不存在,则在常量池中创建一个新的字符串对象。 - 常量池中的字符串是唯一的,不会有重复的内容相同的字符串对象。
- 当使用字面量形式(
2. String str = new String("i");
堆内存
:
new String("i")
会在堆内存中创建一个新的字符串对象,不论字符串常量池中是否已经存在内容相同的字符串对象。- 即使常量池中已有相同内容的字符串,
new String("i")
仍会创建一个新的、独立的字符串对象。
示例代码和比较
public class StringComparison {
public static void main(String[] args) {
String str1 = "i";
String str2 = "i";
String str3 = new String("i");
// 比较引用
System.out.println(str1 == str2); // true,因为str1和str2引用的是常量池中的同一个对象
System.out.println(str1 == str3); // false,因为str3引用的是堆中的一个新对象
System.out.println(str2 == str3); // false,因为str2引用的是常量池中的对象,str3是堆中的新对象
// 比较内容
System.out.println(str1.equals(str3)); // true,因为equals()比较的是内容
}
}
输出结果
true
false
false
true
解释
str1 == str2
: 返回true
,因为str1
和str2
都是通过字面量创建的,指向同一个字符串常量池中的对象。str1 == str3
: 返回false
,因为str3
是通过new
关键字创建的,它指向堆内存中的一个新对象,与str1
不同。str1.equals(str3)
: 返回true
,因为equals()
方法比较的是字符串的内容,而str1
和str3
的内容是相同的。
总结
String str = "i";
: 直接使用字符串字面量,可能复用常量池中的对象。String str = new String("i");
: 总是创建一个新的字符串对象,即使常量池中已经存在相同内容的字符串。
这两种创建字符串的方式在内存使用和对象引用上是不同的。通常,使用字面量创建字符串更加高效,除非有特殊需求,否则不推荐使用new String()
来创建字符串对象。