Java字符串比较(等于vs. ==)



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

我对这里的基础知识感到困惑。自从我开始使用Java以来,我总是被告知"不要使用==进行字符串比较;始终使用平等"。现在,我开始学习OCJP,并遇到了一些令人困惑的观点。

1)

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

s1 == s2返回true;

2)假设A的类别定义为以下:

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)最后,我的myllass具有主要方法:

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

将打印调用java MyClass x false后。

1、2和3之间有什么区别?当两个字符串显然是指不同的对象时,为什么在情况1和2中返回错误?

字符串文字是"实施"的(存储并引用了一个可共享的值),以共享实例,根据Java语言规范的第3.10.5节。

每个字符串文字是对类字符串(§4.3.3)的实例(§4.3.1,§12.5)的引用(§4.3)。字符串对象具有恒定值。字符串文字 - 或更一般的字符串是恒定表达式的值(§15.28) - "实施",以共享独特的实例,使用方法字符串。

这意味着两个字符串文字指的是相同的内部对象,因此在使用==进行比较时,如示例1和2中所做的。但是,示例3中的args[0]字符串不是文字,但是如果您比较其实施价值,如以下内容,表达式将是正确的。

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

同样,如果您不实习示例1或2中的一个字符串,则相关的表达式将是错误的。

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。这就是为什么平等是检查 String等价的最佳方法。

最新更新