繁体   English   中英

java字符串比较(等于与==)[重复]

[英]java string comparison (equals vs. ==) [duplicate]

可能重复:
如何比较Java中的字符串?
演示与Java的字符串比较

我对这里的基础知识感到困惑。 自从我开始使用java以来​​,我总是被告知“不要使用==进行字符串比较;总是使用等于”。 现在我开始学习OCJP,并遇到了一些令人困惑的问题。

1)

String s1 = "Monday"; 
String s2 = "Monday";

s1 == s2返回true;

2)假设有一个类定义如下:

class Friend {
    String name;

     Friend(String n){
        this.name = n;
    }

     public boolean equals(Object o){
         return ((Friend) o).name == this.name;
     }
}

我创建了两个对象的实例:

Friend f1 = new Friend("1");
Friend f2 = new Friend("1");

f1.equals(f2)将返回true

3)最后,我定义了主要方法的MyClass:

public static void main(String[] args) {
        System.out.println(args[0] == "x");
    }

调用java MyClass x之后,将打印java MyClass x false。

1,2和3有什么区别? 为什么在情况1和2中没有返回false,当两个字符串明显指向不同的对象时?

根据Java语言规范的3.10.5节,字符串文字被“实例化”(存储并引用一个可共享值)以共享实例。

每个字符串文字都是类String(第4.3.3节)的实例(第4.3.1节,第12.5节)的引用(第4.3节)。 String对象具有常量值。 字符串文字 - 或者更一般地说,作为常量表达式(第15.28节)的值的字符串 - 是“实例化”以便使用String.intern方法共享唯一实例。

这意味着两个字符串文字引用相同的内部对象,因此在使用==进行比较时是相同的,如示例1和2中所做的那样。但是,示例3中的args[0]字符串不是文字,但如果你比较它的实习值,如下,表达式将是真的。

System.out.println(args[0].intern() == "x"); //prints true

同样,如果您没有实例1或2中的其中一个字符串,则相关表达式将为false。

String s1 = "Monday";
String s2 = new String("Monday");
System.out.println(s1 == s2); //prints false

简短的回答是:字符串池。 你可以在这里找到一个简短的解释:

什么是Java中的字符串池?

还有更长的时间:

http://www.dreamincode.net/forums/topic/187631-the-string-pool/

尝试使用hashCode()方法进行调试

s1.hashCode() must be equal to s2.hashCode() 

args[0].hashCode() is not equal to "x".hashCode()

使用#1方法初始化String值使得两个变量在内存中引用相同的String ,因此这就是为什么==返回true。

但是,最终以其他方式创建的String值几乎总是引用内存中的不同位置,因此==将返回false。 这就是为什么equals是检查String相等性的最佳方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM