与Java中的逻辑运算符的字符串比较

比较两个字符串时,我被告知我们不应该使用逻辑运算符(==)。 我们应该使用String.equals(String)进行比较。 但是,我看到以下代码符合并使用最新的JDK(1.6_23)打印“ Hello Friend ”。 我试着四处寻找,找不到任何参考。 这是什么时候发生的?

 public class StringComp{ public static void main(String args[]){ String s = "hello"; if(s=="hello"){ System.out.println("Hello Friend"); }else{ System.out.println("No Hello"); } } } 

你不应该使用==因为它会做你想的其他事情。

在这种情况下,保存“你好”(读取字符串实习),因此它与你的搅拌一样“巧合”。

==检查两件事情是否完全相同,而不是它们是否具有相同的内容。 这是一个非常大的区别,一些偶然的(虽然可以解释)“虚假的可能性”并不是使用这种方法的理由。

只需使用equals进行字符串比较。

从这个站点的一个例子: http : //blog.enrii.com/2006/03/15/java-string-equality-common-mistake/

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

它返回false,而以下代码返回true。

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

魔术被称为实习

Java 实习生字符串文字,因此评估为true的概率很高:

 String a = "hello"; // "hello" is assigned *and* interned String b = "hello"; // b gets a reference to the interned literal if (a == b) System.out.println("internd."); String c = "hello" + Math.abs(1.0); // result String is not interned String d = "hello" + Math.abs(1.0); // result String is not interned System.out.println(c==d); // prints "false" c = c.intern(); System.out.println(c==d); // prints "false" d = d.intern(); System.out.println(c==d); // prints "true" 

==运算符用于检查两者是否都是对同一String对象的引用,而.equals比较这些值。

它适用于你的情况(和AFAIK一样,它在早期的JVM中也是如此),因为s指的是字符串文字"hello" 。 用文字初始化的字符串引用引用文字(它是背景中的全局对象),而不是单独创建的新对象。 正如其他人所提到的那样,这个术语就是实习 。 因此,示例中的s"hello"指的是同一个物理对象。 考虑

 String s1 = "hello"; String s2 = "hello"; String s3 = "hello"; 

所有这些字符串都引用相同的物理对象,因此任何一对之间或其中任何一个与"hello"之间的’==’比较返回true

然而

 String s4 = new String ("hello"); 

创建一个新对象,因此s4 == "hello"产生false

“Java虚拟机维护一个内部字符串的引用内部列表(唯一字符串池),以避免堆内存中的重复String对象。每当JVM从类文件加载String文字并执行时,它会检查内部列表中是否存在该字符串如果它已经存在于列表中,那么它不会创建一个新的String并且它使用对现有String对象的引用.JVM在内部对String字符进行检查,但不对它通过’new创建的String对象进行检查。 ‘keyword。您可以显式强制JVM对使用String.intern()方法通过’new’关键字创建的String对象执行此类检查。这会强制JVM检查内部列表并使用现有的String对象(如果是已经存在。

所以结论是,JVM在内部为String文字维护唯一的String对象。 程序员不必担心字符串文字,但他们应该打扰使用’new’关键字创建的String对象,他们应该使用intern()方法来避免堆内存中的重复String对象,从而提高java性能。 有关详细信息,请参阅以下部分。“

参考: PreciseJava.com – 字符串和StringBuffer中的优化技术(JVM如何与字符串一起使用)

==比较对象引用

您可以通过观察以下代码中的输出来理解它:

 public class StringComp{ public static void main(String args[]){ String s = new String("hello"); if(s=="hello"){ System.out.println("Hello Friend"); }else{ System.out.println("No Hello"); } } } 

这个程序会打印No hello

因为在此代码中,变量s引用新的String对象,后者又引用String池中的字符串文字“hello”。

==比较对象引用,equals()比较字符串的值。

在您的情况下,您将分配两个值为“hello”的String对象,然后将它们与==进行比较。 编译器可能决定优化并使用相同的对象引用,给出与您获得的结果相同的真实结果。 但是这不是保证行为 – 使用equals()进行值比较会更安全。