2017-02-10 277 views
0

所以我读过,如果你这样写:比较字符串

String a="foo"; 
String b="foo"; 
System.out.println(a==b); 

它会打印“真”,因为第一个实施检查存储池寻找“ foo“,它无法找到它,因此它会创建一个新对象并将foo放入内存池中,然后每个其他字符串都将指向同一个对象。

,如果你写:

String a="foo"; 
String b=new String("foo"); 
System.out.println(a==b); 

它会打印出“假”,因为你强制创建为B A新的对象,因此它不会把它从池。

我的问题是,如果你这样写:

String a=new String("foo"); 
String b="foo"; 
System.out.println(a==b); 

为何仍打印“假”?我的意思是“a”创建一个新的对象,不会查找内存池,但是b应该查看内存池并找到创建的对象“a”并指向它。我在这里错过了什么? 谢谢。

+0

一个不在记忆池,因此a和b都指向DIF引用.... –

+0

'字符串一个新=字符串( “富”);'创建2个对象。首先创建'“foo”',然后用'new String'创建另一个。 – marstran

+0

这很容易,我们有一个字符串池用于字符串的目的,和对象的对象池,您不能比较字符串池中的字符串与对象池中的字符串对象使用==直接 – PSo

回答

1

当您创建新对象时,它不在池中。

b应该在内存池中查找并找到创建的对象“a”并指向它。

这是在游泳池,但它返回"foo"对象不是new String("foo")对象,以便==还是假的。

你可以把一个串入池.intern()

String a = "food".substring(0, 3).intern(); 
String b = "foo"; 
assert a == b; 
-1

字符串一个没有去串池,串B那样 - 这样的引用是不同的。这就是为什么你会错误。

+0

这里有三个'String a'声明。你在说哪一个? – EJP

0

尽管公共池通常是堆的一部分,但通过new创建的对象永远不会进入池中,因为在创建时使用的文字会进入池中。当你比较文字时,你所说的将是真实的。不针对文字和对象。

1

String a="foo";

- >检查字符串池,如果字符串池没有之一,创建于字符串池一个新的String对象

String b="foo";

- >检查字符串池,如果字符串池中包含它会对该String对象进行引用。

String c=new String("foo");

它直接字符串池外,但对象池(存储器)创建一个新的String对象。

从对象的角度来看,2个字符串对象是相同的,所以如果您使用.equals比较这两个,它会返回true。但是如果你使用==比较,它比较引用,它不是指向同一个对象,所以它返回false。

了解更多详情: http://theopentutorials.com/tutorials/java/strings/string-literal-pool/

1

你误会池的工作方式:当你

String a = "foo"; 

String对象"foo"在游泳池结束了,不是因为你第一次创建它,而是因为它是基于字符串文字(双引号内的字符序列)的对象。 Java在常量池中为你创建这个对象。

当你写

String a = new String("foo"); 

从池中的字符串对象"foo"被复制到一个新的String对象,这是放入池中。