版权声明:No Rain No Rainbow https://blog.csdn.net/xiangyuenacha/article/details/84140035
equals()和“==”操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法,后者是操作符。
总结:
1 一般使用比较原生类型如:boolean、int、char等等,使用equals()比较对象。
2 如果两个引用指向相同的对象返回true,equals()的返回结果依赖于具体业务实现,一般重写equals方法时,同样重写hashcode方法,默认的equals方法实现是与“”操作一样的。
3 字符串的对比使用equals()代替操作符
参考代码: EqualsTest
// "=="和equals测试
public class EqualsTest {
public static void main(String[] args) {
int a = 1;
int b = 1;
int c = 2;
System.out.println(a == b); // true
System.out.println(a == c); // false
String s1 = new String("str");
String s2 = new String("str");
System.out.println("s1 == s2: " + (s1 == s2)); // false,比较的是内存地址,引用
System.out.println("s1 equals s2: " + (s1.equals(s2))); // true
// 对象的比较一般重写equals和hashcode方法
Student stu1 = new Student(1, "张三");
Student stu2 = new Student(1, "张三");
System.out.println("stu1 == stu2 : " + (stu1 == stu2)); // false
System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2)); // true
}
static class Student {
private int age;
private String name;
public Student() {
}
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
/**
* 年龄和名称都相等的时候
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
}
}
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
public class EqualsTest {
public static void main(String[] args) {
LinkedList<Student> list = new LinkedList<Student>();
Set<Student> set = new HashSet<Student>();
Student stu1 = new Student(1, "张三");
Student stu2 = new Student(1, "张三");
System.out.println("stu1 == stu2 : " + (stu1 == stu2));
System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2));
list.add(stu1);
list.add(stu2);
System.out.println("list size:" + list.size());
System.out.println("下面的HashSet的内容=====");
set.add(stu1);
set.add(stu2);
System.out.println("set size:" + set.size());
// 修改学生的年龄,hashcode的值会改变
// 当我们将某个对象存到set中时,如果该对象的属性参与了hashcode的计算,
// 那么以后就不能修改该对象参与hashcode计算的那些属性了,否则会引起意向不到的错误的。
stu1.setAge(40);
System.out.println("删除元素stu1是否成功: " + set.remove(stu1));
System.out.println("操作删除元素后set size:" + set.size());
}
}