第四次作业 重写equals方法
@Override
public boolean equals(Object obj) {
if(obj==null)return false;
if(this==obj)return true;
if(obj instanceof User) {
TestentityEntity u = (TestentityEntity) obj;
return this.getId()==u.getId()
&&this.getTname().equals(u.getTname())
&&this.getTid().equals(u.getTid())
}
return false;
}
-
equals与==的区别。
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。 -
Hashcode的作用。
hashCode()方法是为任何一个对象生成一个哈希码,相同(逻辑上认为)的对象应该生成相同的哈希码,Java内置的求出的哈希码是基于存储地址的一个映射关系,保证了对象的哈希码的一一对应关系。散列存储,即是根据一个关键字找到对应的对象,存在对应的哈希表里, -
重写equals()方法就必须重写hashCode()
重写equals()方法就必须重写hashCode()方法主要是针对HashSet和Map集合类型 。集合框架只能存入对象(对象的引用(基本类型数据:自动装箱))。
在向HashSet集合中存入一个元素时,HashSet会调用该对象(存入对象)的hashCode()方法来得到该对象的hashCode()值,然后根据该hashCode值决定该对象在HashSet中存储的位置。简单的说:HashSet集合判断两个元素相等的标准是:两个对象通过equals()方法比较相等,并且两个对象的HashCode()方法返回值也相等。如果两个元素通过equals()方法比较返回true,但是它们的hashCode()方法返回值不同,HashSet会把它们存储在不同的位置,依然可以添加成功。同样:在Map集合中,例如其子类Hashtable(jdk1.0错误的命名规范),HashMap,存储的数据是key,value对,key,value都是对象,被封装在Map.Entry,即:每个集合元素都是Map.Entry对象。在Map集合中,判断key相等标准也是:两个key通过equals()方法比较返回true,两个key的hashCode的值也必须相等。判断valude是否相等equal()相等即可。
稍微提一句:
(1)两个对象,用==比较比较的是地址,需采用equals方法(可根据需求重写)比较。
(2)重写equals()方法就重写hashCode()方法。
(3)一般相等的对象都规定有相同的hashCode。
集合类都重写了toString方法。String类重写了equal和hashCode方法,比较的是值。