欢迎访问宙启技术站
智能推送

Java函数中的equals()和==有何区别?

发布时间:2023-06-15 06:47:14

Java中的equals()和==都是用于比较两个对象的方法,但它们有着不同的比较方式和用途。

equals()方法比较的是对象的内容是否相同,而不是它们在内存中的位置。换句话说,equals()是用来比较对象的值是否相等。在Java中,很多类都实现了equals()方法,如String、Integer等,因为它们用得比较频繁,比如判断字符串是否相等、判断整数是否相等等等。

例如,我们有两个字符串s1和s2,它们的内容相同,但它们在内存中的位置不同。

String s1 = "hello";

String s2 = new String("hello");

System.out.println(s1 == s2); //输出false

System.out.println(s1.equals(s2)); //输出true

在上述代码中,第一个输出结果是false,因为s1和s2在内存中的位置不同,它们引用的是不同的对象。而第二个输出结果是true,因为它们的内容相同,equals()方法比较的是它们的内容是否相同。

另外,如果我们自定义一个类,也可以实现equals()方法来比较对象的内容是否相同。例如:

public class Student {

    private String name;

    private int age;

 

    public Student(String name, int age) {

        this.name = name;

        this.age = age;

    }

 

    @Override

    public boolean equals(Object obj) {

        if (this == obj) {

            return true;

        }

        if (!(obj instanceof Student)) {

            return false;

        }

        Student s = (Student) obj;

        return this.name.equals(s.name) && this.age == s.age;

    }

}

在这个示例中,我们重写了equals()方法,比较的是学生姓名和年龄是否都相同。这样,当我们创建两个学生对象并比较它们时,只有姓名和年龄都相同的时候才会返回true。

Student s1 = new Student("张三", 19);

Student s2 = new Student("张三", 19);

System.out.println(s1 == s2); //输出false

System.out.println(s1.equals(s2)); //输出true

在上述代码中,虽然s1和s2在内存中的位置不同,但它们的姓名和年龄都相同,所以equals()方法比较的结果是true。

而==运算符比较的是两个对象在内存中的位置是否相同,即它们是否指向了同一个对象。如果两个对象的引用相同,也就是指向了同一个对象,==运算符就会返回true,否则返回false。

String s1 = "hello";

String s2 = new String("hello");

String s3 = s1;

System.out.println(s1 == s2); //输出false

System.out.println(s1 == s3); //输出true

在上述代码中,s1和s3引用的是同一个对象,所以==运算符比较的结果是true,而s1和s2引用的是不同对象,所以==运算符比较的结果是false。

需要注意的是,在比较基本数据类型时,==运算符比较的是它们的值是否相同,而不是内存地址。

int a = 10;

int b = 10;

System.out.println(a == b); //输出true

在上述代码中,a和b被赋予相同的值,所以==运算符比较的结果是true。

综上所述,equals()方法比较的是对象的内容是否相同,而==运算符比较的是对象在内存中的位置是否相同。不同的比较方式决定了它们适用于不同的场景,开发人员可以根据需要选择使用它们。