在这段代码中,==比较在Java中是如何工作的

在这段代码中,==比较在Java中是如何工作的,java,comparison,equals,Java,Comparison,Equals,公共类相等测试{ public static void main(String[] args) { String s1 = "abc"; String s2 = s1; String s5 = "abc"; String s3 = new String("abc"); String s4 = new String("abc"); System.out.println("== comparison : " + (s1 == s5)); Sy

公共类相等测试{

public static void main(String[] args) {

    String s1 = "abc";
    String s2 = s1;
    String s5 = "abc";
    String s3 = new String("abc");
    String s4 = new String("abc");
    System.out.println("== comparison : " + (s1 == s5));
    System.out.println("== comparison : " + (s1 == s2));
    System.out.println("Using equals method : " + s1.equals(s2));
    System.out.println("== comparison : " + s3 == s4);
    System.out.println("Using equals method : " + s3.equals(s4));
}
}

输出:

== comparison : true
== comparison : true
Using equals method : true
false
Using equals method : true

有人能解释一下s3==s4的输出在上面是如何变为false的,还有这个equals标记操作是如何工作的吗?

这个“==”操作符比较内存位置(这两个变量名是否指向同一个实例),而“.equals()”比较值(即使是不同的副本,它们是否共享相同的内容?)

如果我没弄错的话,==操作符在s3和s4这样定义时比较对象。由于对象不相同(没有相同的地址或内存位置;通常称为引用),因此运算符给出false。==运算符适用于其他示例,因为您正在比较基元字符串。这是一个原因(至少在我的经验中是这样),即==不是一个好的选择,您应该始终使用.equals,以确保您比较的是字符串而不是对象本身。

显然s3和s4与值相等,但与对象无关。因此,
s3==s4
为false,因为它是比较内存位置

您可以了解java中
==
和equals()之间的区别

运算符“
=

在Java中,当使用“==”操作符比较两个对象时,它将 检查对象是否引用内存中的同一位置。在里面 换句话说,它检查这两个对象名是否基本相同 对同一内存位置的引用

equals()方法

相等法 在对象类中定义,从该对象类中,每个类都是 直接或间接后代。默认情况下,equals()方法 实际上,其行为与“==”运算符相同–这意味着它将检查 查看两个对象是否引用内存中的同一位置。但是, equals方法实际上是用来比较两个对象的内容, 而不是它们在内存中的位置


没有“原始字符串”这样的东西。你当然是对的-我应该更仔细地选择我的措辞。祝贺你在StackOverflow上提出了第一个最常见的问题。当你发布一个非常常见的问题时,它表明你根本没有努力先研究这个主题。自己做一些研究很重要,因为a)你可能会发现你不是世界上第一个想到这个问题的人b)你有更好的机会理解答案。唯一比一次又一次地看到同样的问题更令人沮丧的是,人们提出了他们不希望理解答案的问题。