这是一道经典的笔试题:
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