分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/
会创建一个或两个 String
对象,具体情况如下:
-
字符串常量池中的对象:当代码里出现字符串字面量
"123"
时,Java 会先去字符串常量池查看是否已有值为"123"
的对象。要是没有,就会在字符串常量池中创建一个String
对象来存储"123"
;若已有,就直接使用该对象。 -
堆内存中的对象:
new String("123")
语句会在堆内存里创建一个新的String
对象,此对象会复制字符串常量池中"123"
对象的值。
比如下面的代码:
public class StringObjectCreation {
public static void main(String[] args) {
// 字符串常量池中的对象
String constantPoolStr = "123";
// 堆内存中的对象
String heapStr = new String("123");
// 比较常量池中的对象和堆内存中的对象
System.out.println(constantPoolStr == heapStr); // 输出 false,因为它们是不同的对象
// 比较内容
System.out.println(constantPoolStr.equals(heapStr)); // 输出 true,因为它们的内容相同
}
}
-
代码里的
"123"
会在字符串常量池中创建一个String
对象。 -
new String("123")
会在堆内存中创建一个新的String
对象。 -
==
运算符用于比较对象的引用,所以constantPoolStr == heapStr
结果为false
。 -
equals
方法用于比较对象的内容,所以constantPoolStr.equals(heapStr)
结果为true
。
所以,String a = new String("123");
一般会创建两个 String
对象,一个在字符串常量池中,另一个在堆内存中。不过,若字符串常量池中已经存在 "123"
对象,那就只会在堆内存中创建一个新的 String
对象。