Java字符串池如何工作? Java如何决定是否使用它?

问题描述 投票:0回答:2

我知道有一个字符串池,应该保留一些创建的字符串,以便不重复它们。因此,如果用户想要创建一个与另一个字符串具有相同值的字符串,则将不会再次创建该字符串(除非调用了new String()),它将成为对同一对象的引用。所以,我的问题是为什么这段代码的结果是“ false false”?

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

我感兴趣的是为什么会这样,而不是如何使Java使用池。

java string pool string-pool
2个回答
0
投票

上述代码的正确输出为true false。为什么存在字符串池的答案只是简单地优化内存使用。每次都可以在堆内存中存储相同的字符串,而该字符串只能在池中保存一次,并且只要JVM运行就可以使用,这有什么意义呢?另一方面,当我们明确提到用Java创建新对象String s = new String("test")时,应将其创建为新对象并应单独存储在堆中,从而每次引用此特定引用(对象s)时都可以进行更新。这根本不会影响字符串池。


-1
投票

Java具有几种相等类型。通常,'=='运算符用于确定两个对象是否相同。

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

在上面的代码中,a和b引用相同的对象,所以它是真的。

要确定两个字符串是否具有相同的数据,请使用equals方法。

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

上面的代码将打印false(a和b不是同一对象),然后打印true(它们包含相同的数据)。请注意,在这种情况下,两个String对象是否指向字节集无关紧要,只要它们包含相同的数据即可。

很抱歉,这可能会打印true,true,因为javac可以将a和b设为相同的对象,但这不能保证。

© www.soinside.com 2019 - 2024. All rights reserved.