【问题标题】:equals method and ==operator java等于方法和 == 运算符 java
【发布时间】:2020-10-01 20:04:04
【问题描述】:

请查看下面的代码并帮助我理解这个概念 equals 方法只比较对象的值,而 == 运算符比较对象的引用,那么为什么在代码中 == 运算符返回 false,即使创建了两个单独的对象

    Ex Obj1=new Ex();//creating Object of Ex class
    Ex Obj2=new Ex();//creating another Object of Ex class
    System.out.println(Obj1==Obj2);//false
    System.out.println(Obj1.equals(Obj2));//false

【问题讨论】:

  • 你能用你自己的话解释一下什么是引用吗?
  • 公共类 Ex 是一个类,整个代码都在堆栈溢出中,不允许我编写整个代码,所以发布了其中的一部分,并且 Obj1 的类型是 Ex 引用 Ex asn,obj2 也是另一个引用 Ex 的新对象
  • 类 Ex { public static void main(String[] args) { Ex Obj1=new Ex(); Ex Obj2=新的 Ex(); System.out.println(Obj1==Obj2); System.out.println(Obj1.equals(Obj2)); } }
  • 请编辑问题以在您的评论中应用代码。

标签: java methods operators


【解决方案1】:

一般来说,Java 中的 equals() 和“==”运算符都用于比较对象以检查相等性,但两者之间存在一些区别:

  1. .equals() 方法和 == 运算符的主要区别在于,一个是方法,另一个是运算符。

  2. 我们可以使用 == 运算符进行引用比较(地址比较)和 .equals() 方法进行内容比较。简单来说, == 检查两个对象是否指向相同的内存位置,而 .equals() 计算对象中值的比较。

根据您的示例, 在第一次比较中,您使用“==”来比较 2 个对象。这里两个对象都有不同的内存位置,这就是输出为假的原因。 在第二次比较中,您使用“.equals()”来比较 2 个对象。这两个对象是不同的。

【讨论】:

  • 这就是我的问题,为什么当我创建了 2 个指向两个不同内存位置的不同对象时,equals 方法返回 false,而 equals 应该只在该位置进行campare 值,如上所述,输出为 false,但应该是真的
  • 因为您没有覆盖 equals() 来比较这些值。默认的 Object.equals() 和 == 做同样的事情。
  • 如上所述,== 运算符作用于引用,equals() 作用于内容或值。如您所见, obj1 和 obj2 都指向引用而不是实际值。您可以通过任何类变量在空对象中分配任何值,而不是使用 equals() 方法来比较实际内容。
【解决方案2】:

这个概念其实是这样的: 当你定义一个初步的类数据时

int val1 = 1;

变量 val1 实际上在它的位置存储了 1。

但是,对象类数据将存储地址而不是数据

例如人 person1 = 新人() person1 实际上存储了一个 Person 类对象的地址

==在不同情况下的实际对比 案例一:

int val1 = 1;
int val2 = 1;
val1 == val2; // true (as the thing behind is actually 1)

案例2:

Person person1 = new Person();
Person person2 = new Person();
person1 == person2; //false (as the thing behind is address point to different location)

equals() 实际上是从 Object.equals() 扩展而来的 您可以使用类型特定的逻辑覆盖或重载该方法以比较对象 例如

person1.name = tom;
person1.age = 10;
person2.name = peter;
person2.age = 10;
person1.equals(person2);// the result actually depends on the logic defined

例如

public boolean equals(Person obj) { // in this case person1== person2 is true
    return this.age == obj.age;
}

public boolean equals(Person obj) { // in this case person1== person2 is false
    return this.name == obj.name;
}

【讨论】:

    【解决方案3】:

    如您所料,当使用 == 进行比较时,答案为 false,因为 obj1 和 obj2 是不同的对象引用。

    如果查看 Object.class 的代码,equal 方法的代码如下:

        public boolean equals(Object obj) {
            return (this == obj);
        }
    

    Object class code

    默认的 equals 实现仅使用 == 进行引用比较,返回 false。这就是为什么您与 equals 的比较也返回 false 的原因。

    正如在其他答案中提到的,通常没有人想要这种默认行为,这就是为什么您必须覆盖该行为并提供您自己的逻辑来考虑这些对象是否具有相同的内容。在这种情况下,相同的内容意味着两个类中都没有内容。

    【讨论】:

    • 这个关键字在这里做什么也请解释一下这个==obj没有得到那个
    • 该方法存在于 Object 类中。默认情况下,您的所有类都扩展了对象类。因此,当您没有指定 equals 实现时,实际上会执行上述方法。在上述方法的上下文中,当您在对象Obj1 上执行它时,this 指的是Obj1 的参考。当您执行 Obj1.equals(Obj2) 时,此处将 Obj2 引用作为参数传递。上面的方法在一个名为obj 的变量中接受它。因此,== 正在对 Obj1 和 Obj2 进行参考比较。
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2016-12-09
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多