String str=new String("123"); 究竟创建了几个对象

这是一道经典的笔试题:
String s=new String("abc");
String s1="abc";
String s2=new String("abc");
上段代码究竟产生了几个对象?
这涉及到JVM中String 的机制,当你new 一个String时,总会在堆中新建一个对象,然后String 引用指向这个对象,然后检查String pool(字符串池)中有没有和这个字符串内容一样的字符串,没有的话,将此字符串加入String pool。
当你用形如 String a = "abc",声明一个字符串时,jvm先检查串池里有没有 abc 这个字符串,有的话直接指向此字符串,没有的话在串池中增加这个字符串,然后指向它。
你可以试试 String a ="abc"; String b = "abc";   System.out.print(a == b)  输出true
此时,a 和 b都指向 串池中的 "abc"
而 String a = new ("abc"); String b = "abc";   System.out.print(a == b)  输出false 
此时,a指向堆中的"abc"对象,b指向串池中的"abc"对象
"=="比较的是两个引用变量所指向的是否是同一个对象,是的话则返回true,否则false

String str=new String("123"); 究竟创建了几个对象

上一篇:【C#小知识】C#中一些易混淆概念总结(五)---------继承


下一篇:UVa 156 反语片