本帖最后由 徐鹏辰 于 2015-8-5 14:19 编辑
- <p>import java.util.*;
- import java.lang.*;
- class HashSetTest
- {
- //输出方法
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- //建立HashSet集合
- HashSet hs = new HashSet();
- //添加元素
- hs.add(new Person("a1",11));
- hs.add(new Person("a2",12));
- hs.add(new Person("a3",13));
- hs.add(new Person("a2",12));
- </p><p>
- HashSet hs1 = new HashSet();
- //添加元素
- hs1.add(new Person(11));
- hs1.add(new Person(12));
- hs1.add(new Person(13));
- hs1.add(new Person(13));</p><p>
- HashSet hs2 = new HashSet();
- //添加元素
- hs2.add(new Person("z"));
- hs2.add(new Person("v"));
- hs2.add(new Person("b"));
- hs2.add(new Person("z"));
- Iterator it = hs2.iterator();
- while(it.hasNext())
- {
- Person p = (Person)it.next();
- sop(p.getName());
- //sop(p.getAge())
- //sop(p.getName()+","+p.getAge()+"--"+Integer.toHexString(p.hashCode())+"---"+p);
- }
- }
- }
- //自定义对象
- class Person
- {
- private String name;
- private int age;
- Person(String name)
- {
- this.name = name;
- }
- Person(int age)
- {
- this.age = age;
- }
- Person(String name,int age)
- {
- this.age = age;
- this.name = name;
-
- }
- //自定义hash值
- public int hashCode()
- {
- //判断谁调用了该方法
- //System.out.println(this.name+"....hashCode");
- //return name.hashCode()+age*37;
- return 60;
- }
-
- //比较对象方法
- /*
- public boolean equals(Object obj)
- {
- //判断是否属于Person类,不属于则直接返回。
- if(!(obj instanceof Person))
- return false;
- //类型的强制转换
- Person p = (Person)obj;
- //判断方法是否调用,进而演示对象的比较过程
- //System.out.println(this.name+"...equals.."+p.name);
- //return this.name.equals(p.name) && this.age == p.age;//特有的比较方式
- }
- */
- //获取对象属性
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }</p>
复制代码
HashSet集合只复写hashCode,不复写Object类equals!
Object类中的equals方法比较的地址值。
String类中equals方法复写了Object类equals方法,特有的比较方式,比较字符串是否相同。
HashSet集合为何还有重复,不是应该比较地址值吗?是我哪里理解或者记错了!!
|
|