与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()进行值比较会更安全。
- JavaFX和SwingNode – 部分黑色窗口
- 如何避免exception使用mongoDB Java驱动程序3.4+或3.6+过早地到达流的末尾? (插入期间)
- 为什么我们有包含(Object o)而不是contains(E e)?
- 在不使用条件代码的情况下确定数字是奇数还是偶数
- 为什么int 上的Arrays.asList返回List ,而不是List ?
- java正则表达式:替换$ {var}
- 使用Guava的Optional与@XmlAttribute
- 如何更新OpenJDK的时区信息?
- java.util.MissingResourceException:找不到基本名称消息的bundle,locale en_US