我有下面几行代码来比较字符串。str1不等于str2,这是可以理解的,因为它比较了对象引用。但是为什么s1等同于s2呢?
String s1 = "abc";
String s2 = "abc";
String str1 = new String("abc");
String str2 = new String("abc");
if (s1==s2)
System.out.println("s1==s2");
else
System.out.println("s1!=s2");
if (str1==str2)
System.out.println("str1==str2");
else
System.out.println("str1!=str2");
if (s1==str1)
System.out.println("str1==s1");
else
System.out.println("str1!=s1");
输出:
s1==s2
str1!=str2
str1!=s1
发布于 2012-03-14 16:34:25
字符串常量池实际上将缓存所有字符串文字,因此它们在下面是相同的对象,这就是为什么您会看到为s1==s2
所做的输出。它本质上是VM中的一个优化,以避免每次声明文字时都创建一个新的string对象,这可能很快就会变得非常昂贵!在您的str1==str2
示例中,您显式地告诉VM创建新的string对象,因此它为false。
顺便说一句,对任何字符串调用intern()
方法都会将其添加到常量池中,只要对应的字符串还不存在(并返回添加到常量池中的字符串)。但是,这样做并不一定是一个好主意,除非你确定你正在处理的字符串肯定会被用作常量,否则你可能最终会很难追踪到内存泄漏。
发布于 2012-03-14 16:35:42
在Java中,相同的常量字符串将被重用。因此s1
和s2
指向相同"abc“对象和s1==s2
。但是当您使用new String("abc")
时,会创建另一个对象。所以s1 != str1
。
https://stackoverflow.com/questions/9698260
复制相似问题