用HashSet集合来存储Person类对象;
具体思路:
HashSet的特性就是无序性和不重复性,
所以我们往里面存储Person对象的时候就可实现:去除重复对象的功能;
通过这个例子的学习,我们发现:
HashSet类型对象的add()方法底层就调用了equals()方法,
它可以让每一个新添加的元素与集合中已经存在的元素进行比较,看集合中是否
存在该元素,如存在就不添加进集合。具体比对的方法也有讲究:
它是先比较Person对象的hashCode()方法返回的值,然后再比较对象各个私有成员变量。
hashCdoe()是一个Object类下的方法,不是集合中的,String类也又该方法,该方法详细情况请参考文档。
再深入,我们又会遇到两问题:
1,给Person对象添加了hashCode()方法,获得哈希值;但好像比对的过程存在冗余的情况;
2,为此我们还得重写HashSet集合对象add()方法中的equals()方法!
解释完毕,再接再厉!
*/
package jihe;
import java.util.*;
class Person{
private int age;
private String name;
Person(int a, String n){
this.age = a;
this.name = n;
}
public int hashCode() {
//如果返回60 ,就是意味着每个对象的哈希值都相同,这不利于去除重复元素中对象间的比较。
return 60;
//所以我们在获取对象的哈希值时,要根据对象的自变量来获取,这样我们就能保证每个对象都有不同的哈希值。
//常用获取哈希值的格式如下;其中age*24没有什么特别的意义,只是为了增强哈希值的不重复性,
//24可以用其他数字代替,数值大小不要过大或过小即可。
//return name.hashCode()+age*24;
}
public boolean equals(Object obj) {
if(!(obj instanceof Person))
return false;
Person p = (Person)obj; System.out.println(name+"::::equals:::"+p.name);
return p.getName().equals(name) && p.getAge()==age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
public class hashset_person {
public static void main(String[] args) {
HashSet<Person> hs = new HashSet<Person>();
hs.add(new Person(23, "lily"));
hs.add(new Person(23, "tom"));
hs.add(new Person(34, "lily"));
hs.add(new Person(23, "tom"));//重复元素
sop(hs);
}
public static void sop(HashSet hs) {
Iterator<Person> it = hs.iterator();
while(it.hasNext()) {
Person p = (Person)it.next();
System.out.println(p.getName()+"===="+p.getAge());
}
}
}
image.png
当我们把hahsCode()方法中的return 60;换成return name.hashCode()+age*24;就会有以下结果:
image.png我们还可以在hashCode()中加上System.out.println(name+"....hashCode");效果更显而易见:
image.png总结:以后遇到HashSet集合的使用基本都要重写hashCode()和equals()方法!
除了添加元素需要这样判断,删除元素也是一样的;HashSet集合和ArrayList在这两个功能上都依赖equals()方法;只是HashSet集合它还要先判断hashCode()返回的哈希值;去重上效率更高。
网友评论