_168168ww 2024-07-24 16:11 采纳率: 0%
浏览 8
已结题

Java中双等号为啥不能比较没有父子关系的两个对象

为什么Java双等号不能比较没有父子关系的两个对象?我不理解所以求解答

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 16:11
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    在Java中,使用双等号(==)比较两个对象时,实际上比较的是两个对象的引用地址,即它们在内存中的位置。如果两个对象的引用地址相同,那么它们被认为是相等的。然而,对于没有父子关系的两个对象,它们通常在内存中有不同的地址,即使它们的内容或状态是相同的。这就是为什么使用双等号不能比较没有父子关系的两个对象的原因。

    下面是一段示例代码,演示了如何使用equals()方法来比较两个没有父子关系的对象的内容:

    public class Main {
        public static void main(String[] args) {
            String s1 = new String("hello");
            String s2 = new String("hello");
    
            // 使用双等号比较,比较的是引用地址
            System.out.println(s1 == s2); // 输出 false
    
            // 使用 equals 方法比较,比较的是内容
            System.out.println(s1.equals(s2)); // 输出 true
    
            // 自定义类,重写 equals 方法
            Person p1 = new Person("John", 30);
            Person p2 = new Person("John", 30);
    
            System.out.println(p1.equals(p2)); // 输出 true
        }
    }
    
    class Person {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (obj == null || getClass() != obj.getClass()) return false;
            Person person = (Person) obj;
            return age == person.age && (name != null ? name.equals(person.name) : person.name == null);
        }
    
        @Override
        public int hashCode() {
            return 31 * (name != null ? name.hashCode() : 0) + age;
        }
    }
    

    在这个示例中,我们首先创建了两个String对象s1s2,它们虽然内容相同,但是使用==比较时,由于它们引用不同的内存地址,所以返回false。然后,我们使用equals()方法比较这两个字符串对象,由于String类已经重写了equals()方法来比较内容,所以返回true

    接着,我们定义了一个Person类,并重写了equals()方法,以比较对象的属性值。创建了两个Person对象p1p2,它们具有相同的属性值,使用equals()方法比较时,返回true

    通过这个示例,你可以看到如何通过重写equals()方法来实现对象内容的比较,而不是仅仅比较它们的引用地址。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月26日
  • 创建了问题 7月24日