本帖最后由 邱成 于 2012-10-2 23:12 编辑
jvm在启动时,在内存中开辟了一块空间叫做字符串池(string pool)用于存放字符串常量。
每一个常量字符都是一个匿名String类对象。
String s1="abc" ,jvm先到字符串池中查看,有没有一个内容是"abc"的String类对象,有就让s1直接指向这个对象,没有,就新建一个,再让s1指向。
所以你如果再写一个String s2="abc" ,字符串池中并没有新建对象,只不过让s2指向了"abc"对象,所以s1==s2;
但是当你String s3=new String("abc");后,先查看字符串池里有没有内容"abc"的对象。有,就在池中创建一个拷贝到堆(heap)中;没有,就直接在堆中创建对象。两种情况都把堆内存中的地址返回给s3.
很明显,s1,s2都不等于s3.
所以String str=new String(“abc”);能够产生两个对象,分别是常量池中的abc和堆中的abc |