我有以下几行代码来比较String。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
字符串常量池实际上将缓存所有字符串文字,因此它们是下面的同一对象,这就是为什么你看到要执行输出的原因s1==s2。本质上,这是对VM的一种优化,可以避免每次声明文字时都创建新的字符串对象,这可能会很快变得非常昂贵!在你的str1==str2示例中,你明确地告诉VM创建新的字符串对象,因此为什么它是错误的。
s1==s2
str1==str2
顺便说一句,intern()在任何字符串上调用该方法都会将其添加到常量池中(并返回添加到该池中的String。)但这不一定是一个好主意,但是除非你确定要处理绝对将用作常量的字符串,否则你可能最终难以跟踪内存泄漏。
intern()