recherche

Maison  >  Questions et réponses  >  le corps du texte

java - 关于Object中的equals方法和String中的equals方法的疑惑?

首先是这段代码:

public class test {
    public static void main(String[] args) {
        String s1 = "Monday";
        String s2 = new String("Monday");
        if (s1 == s2){
            System.out.println("s1 == s2");}
        else{
            System.out.println("s1 != s2");
        }
        if (s1.equals(s2)) {
            System.out.println("s1 equals s2");
        }else{
            System.out.println("s1 not equals s2");
        }
    }
}

输出结果是:s1 != s2 和 s1 equals s2; 这个我可以理解,使用new操作符后,在堆内存中又新开辟了一块空间,s1和s2在堆内存中的值相同,但是引用的地址不同。但是在博客园的这篇文章看到下面这段代码:

public class test{
    public static void main(String[] args)
    {
        test obj1 = new test();
        test obj2 = new test();

        if(obj1 == obj2){
            System.out.println("obj1 == obj2");
        }else{
            System.out.println("obj1 != obj2");
        }
        if(obj1.equals(obj2)){
            System.out.println("obj1 equals obj2");
        }else{
            System.out.println("obj1 not equals obj2");
        }
    }
}

输出: obj1 != obj2 obj1 not equals obj2
昨天晚上看了那篇文章的评论,把我自己的理解写出来,但是还是不是很清楚,我大意是这样的:
java当中所有类都继承自Object这个基类,在Object中的定义了一个equals方法,这个方法的初始化行为是比较对象的内存地址值(Object的equals方法使用==比较的),但在一些类库中这个方法被覆盖掉了,比如String, Interger, Date这些类中equals有其自己的实现方法,String类继承自Object类,也继承了equals方法,但是重写了该方法,不再比较类在堆内存中的存放地址了,而是比较存在堆中的值。 ???
这个解释不知道对不对,望指教,还有,关于obj1 not equals obj2你们是怎么看的??

阿神阿神2859 Il y a quelques jours788

répondre à tous(4)je répondrai

  • 大家讲道理

    大家讲道理2017-04-17 13:54:08

    == 比较就不用说了,任何情况下都是比较内存地址。
    equals比较,是一个方法调用,默认的实现(Object类)是使用了==

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

    第一段代码:
    比较的是String对象,而String类覆写了equals()方法,比较的是字符串内容,所以输出了s1 equals s2

    这个你理解的没有问题!

    第二段代码:
    比较的是test对象,test类没有覆写equals()方法,所以还是默认比较内存地址,从而输出了obj1 not equals obj2

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 13:54:08

    在下以为应该先抛开代码实现,直接看 equals 方法存在的意义———对比对象与对象是否相同。
    那么问题来了,对象与对象怎样才算相同呢? 这个就该由对象所属的类的作者来决定了,也只有他才能决定其创造的类的实例应该如何对比相同。

    String的作者是谁不知道,但你也赞同他的 equals 实现吧?字符串对比字符串,就该对比字符序列是否相同。

    至于 test ,它的作者是题主你,而你没有定义该如何对比test对象,但却调用了 equals 想要对比它。此时会有个什么结果? 只能是 test 这个类的父类的 equals 结果呗,默认的父类是 Object 类,@ch_gilbert 已经说明了~

    répondre
    0
  • 阿神

    阿神2017-04-17 13:54:08

    equals 取决于具体的实现

    public class A{ 
        private String color;
        private int weight;
         public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public boolean equals(Object obj){
                if (obj == null)
                    return false;
              if (this == obj)
                    return true;
                if (getClass() != obj.getClass())
                    return false;
                A other = (A) obj;
                if (color == null) {
                    if (other.color != null)
                        return false;
                } else if (!color.equals(other.color))
                    return false;
                if (weight != other.weight)
                    return false;
                return true;
        }
    
    }
    

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:54:08

    你说的真复杂,好歹是看完了,应该是正确的理解
    我贴一下Stirng.equals方法的源码,很明显。

     public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                return false;
            }
            return true;
            }
        }
        return false;
        }
    

    ==的比较,你可以理解,equals说白了不就是个方法么?具体怎么实现的就是怎样的结果,这何必纠结呢?
    假设equals这么写

    怎么样,==不同,就看如果是“111111”才返回true。

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                if (anotherString.equals("111111")) {
                    return true;
                }
            }
            return false;
        }
    

    这么说明白了吗?equals这东西只是一个方法而已!因为Object里面有,其他的Class都继承它,所以看上去特殊点。

    répondre
    0
  • Annulerrépondre