毕老师视频中说到在hashset集合中存入元素时,会先比较元素的哈希值,若相同再equals比较。
请教下各位:但这里比较完后,为什么每个元素还会调用一次hashcode()方法
预期运行结果:
wang01hashcode
wang02hashcode
wang03hashcode
wang03hashcode
wang03..equals..wang03
[Person@d09b2415, Person@d09b2429, Person@d09b243d]
实际运行结果:(附件有图)
wang01hashcode
wang02hashcode
wang03hashcode
wang03hashcode
wang03..equals..wang03
wang01hashcode
wang02hashcode
wang03hashcode
[Person@d09b2415, Person@d09b2429, Person@d09b243d]- import java.util.*;
- class HashSetDemo
- {
- public static void main(String[] args)
- {
- HashSet hs = new HashSet();
- hs.add(new Person("wang01",11));
- hs.add(new Person("wang02",12));
- hs.add(new Person("wang03",13));
- hs.add(new Person("wang03",13));
- print(hs);
- }
- public static void print(Object obj)
- {
- System.out.println(obj);
- }
- }
- class Person
- {
- private String name;
- private int age;
- Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public boolean equals(Object obj) //复写equals方法,判断姓名和年龄是否相同。
- {
- if (!(obj instanceof Person))
- return false;
- Person p = (Person)obj;
- System.out.println(this.getName()+"..equals.."+p.getName()); //调用equals方法时,打印调用对象的姓名和比较对象的姓名。
- return this.getName().equals(p.getName()) && this.getAge() == p.getAge(); //判断姓名和年龄是否相同,并返回判断结果。
- }
- public int hashCode() //复写Object类中的hashCode方法,获取仅与姓名和年龄有关的哈希值。
- {
- //调用hashCode时,打印出调用对象的姓名+hashcode。
- System.out.println(getName()+"hashcode");
-
- return name.hashCode()+age*19;
- }
- }
复制代码 |
-
1.jpg
(40.7 KB, 下载次数: 22)
|