1.==和equals的区别
- ==是比较运算符,equals最初始Object中的一个方法
- ==比较的是引用地址(内存地址),equals比较的是内容的相等(在自定义对象中内容的相等可以自己来定义)
- Object中的equals方法就是“==”,只不过在其子类中一般都会重写equals方法,将其重写为比较内容相等的方法,例如String
- ==还可以用来比较基本数据类型
2.自定义equals方法
判断传入对象与当前对象是否相等,相等返回true,否则进2
判断传入对象是否是当前类的实例,相等进3,否则返回false
根据需求判断传入对象与当前对象内容是否相同,相同返回true,否则返回false
例如规定Student对象的id和name属性相等时就认为对象相等 ```java package junhaox.cn.string;
public class Student { private int id; private String name; private int age;
//setter/getter/constructor...@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj instanceof Student) {Student anStudent = (Student) obj;if (this.id == anStudent.getId() && this.name.equals(anStudent.getName())) {return true;}else {return false;}}else{return false;}}
<a name="837e99a3"></a>## 3.重写equals方法同时要重写hashCode方法1.hashCode在Java中的应用场景:用于快速定位,一般使用与带“hash”的集合中,如HashMap,HashSet等2.在HashMap中内容相同的键不能重复(或者说添加内容相同的键时后者的value会覆盖前者的value);在HashSet中内容相同的元素只能添加一次(重复添加会返回false:添加失败)3.hash集合的设计理念:首先根据对象的hashCode判断对象是否相同,hashCode相同则在根据equals判断内容是否相同```javapublic static void main(String[] args){Set set = new HashSet();/*没有重写hashCode之前3个Student对象分别指向不同的内存空间,所以为3个不同的对象,但是(1)和(3)的内容明显相同(通过equals判断),显然有些矛盾*/set.add(new Student(1, "zs", 23));//true (1)set.add(new Student(2, "ls", 23));//true (2)set.add(new Student(1, "zs", 23));//true (3)}
- hashCode方法
@Overridepublic int hashCode() {int hash = Integer.hashCode(this.id)+this.name.hashCode();return hash;}
public static void main(String[] args){Set set = new HashSet();/*没有重写hashCode之后通过hashCode判断(1)和(3)hashCode值相同,在通过equals判断(1)和(3)的内容确实相同,所以添加失败*/set.add(new Student(1, "zs", 23));//true (1)set.add(new Student(2, "ls", 23));//true (2)set.add(new Student(1, "zs", 23));//false (3)}
hashCode的说明:
- 两对象相等(引用地址),则hashCode一定相等
- 两对象的hashCode相等,这两个对象不一定相等
- 两对象不等(引用地址),这两个对象的hashCode不一定不等
- 两对象的hashCode不等,则这两个对象一定不等
