Java函数中的equals()和==有何区别?
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()方法比较的是对象的内容是否相同,而==运算符比较的是对象在内存中的位置是否相同。不同的比较方式决定了它们适用于不同的场景,开发人员可以根据需要选择使用它们。
