java - 在比较对象时运算符和equals运算有何区别 - 谈一谈跟equals的区别




“.equals”和“==”之间有什么区别? (8)

==是一名运营商。 equals是Object类中定义的方法

==检查两个对象是否在内存中具有相同的地址,并且对于原始它检查它们是否具有相同的值。另一方面,quals方法检查被比较的两个对象是否具有相等的值(取决于当前的方式)已经为对象实现了equals方法.equals方法不能应用于原语(这意味着如果a是原语,则不允许a.equals(someobject),但是允许someobject.equals(a))。

这个问题在这里已有答案:

我今天换了讲师,他说我用了一个奇怪的代码。 (他说最好使用.equals ,当我问为什么时,他回答“因为它是!”)

所以这是一个例子:

if (o1.equals(o2))
{
 System.out.println("Both integer objects are the same");
}

而不是我习惯的:

if (o1 == o2)
{
  System.out.println("Both integer objects are the same");
}

两者之间有什么区别。 为什么他的方式(使用.equals )更好?

通过快速搜索找到了这个 ,但我真的无法理解这个答案:


==运算符比较两个对象引用以检查它们是否引用同一实例。 这也将在成功匹配时返回true。例如

public class Example{
public static void main(String[] args){
String s1 = "Java";
String s2 = "Java";
String s3 = new string ("Java");
test(Sl == s2)     //true
test(s1 == s3)      //false
}}

上面的例子==是一个参考比较,即两个对象都指向相同的内存位置

String equals()计算对象中值的比较。

   public class EqualsExample1{
   public static void main(String args[]){
   String s = "Hell";
   String s1 =new string( "Hello");
   String s2 =new string( "Hello");
   s1.equals(s2);    //true
    s.equals(s1) ;   //false
    }}

上面的示例它比较字符串的内容。 如果字符串匹配,它将返回true,否则返回false。


(1)==可以应用于基元和对象类型,但equals()方法只能应用于对象类型。

(2)==不能覆盖内容比较,但可以覆盖equals方法进行内容比较(例如:String类,包装类,集合类)。

(3)==在尝试申请异构类型时给出无法比较的类型错误,其中equals方法返回false。


equals( )方法和==运算符执行两个不同的操作。 equals( )方法比较String对象内的String==运算符比较两个对象引用以查看它们是否引用同一实例。 以下程序显示了两个不同的String对象如何包含相同的字符,但对这些对象的引用不会相等:

// equals() vs ==
class EqualsNotEqualTo {
     public static void main(String args[]) {
          String s1 = "Hello";
          String s2 = new String(s1);
          System.out.println(s1 + " equals " + s2 + " -> " +
          s1.equals(s2));
          System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2));
     }
}

变量s1引用由“Hello”创建的String实例。 s2引用的对象是使用s1作为初始化程序创建的。 因此,两个String对象的内容是相同的,但它们是不同的对象。 这意味着s1s2不引用相同的对象,因此不是== ,如前面示例的输出所示:

Hello equals Hello -> true
Hello == Hello -> false

假设“==”运算符返回true,如果两个操作数都属于同一个对象但是它将返回true,因为我们无法为单个对象分配多个值

public static void main(String [] args){
    String s1 = "Hello";
    String s1 = "Hello";  // This is not possible to assign multiple values to single object
    if(s1 == s1){
      // Now this retruns true
   }
}

现在,当实际发生这种情况时,如果没有发生那么为什么这是==比较功能....


在Java中, ==总是只比较两个引用(对于非基元,即) - 即它测试两个操作数是否引用同一个对象。

但是,可以覆盖equals方法 - 因此两个不同的对象仍然可以相等。

例如:

String x = "hello";
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

System.out.println(x == y); // false
System.out.println(x.equals(y)); // true

另外,值得注意的是,任何两个相等的字符串常量 (主要是字符串文字,但通过串联的字符串常量的组合)最终将引用相同的字符串。 例如:

String x = "hello";
String y = "he" + "llo";
System.out.println(x == y); // true!

这里xy是对同一个字符串的引用,因为y是一个等于"hello"的编译时常量。


如果你和我各自走进银行,每个人开一个全新的账户,每个存款100美元,然后......

  1. myAccount.equals(yourAccount)true因为它们具有相同的值 ,但是
  2. myAccount == yourAccountfalse因为它们不是同一个帐户

(当然,假设Account类的定义合适。;-)


public static void main(String[] args){
        String s1 = new String("hello");
        String s2 = new String("hello");

        System.out.println(s1.equals(s2));
        ////
        System.out.println(s1 == s2);

    System.out.println("-----------------------------");

        String s3 = "hello";
        String s4 = "hello";

        System.out.println(s3.equals(s4));
        ////
        System.out.println(s3 == s4);
    }

在这段代码中,您可以将“==”和“.equals”都置于其中

这里.equals用于比较引用对象,'=='用于比较对象的状态。





equals