A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 花园农场 中级黑马   /  2014-6-10 17:36  /  1303 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

01
import java.util.*;
02
public class Main1
03
{
04
    public static void main(String args[])
05
    {
06
        HashSet hs=new HashSet();
07
        hs.add(new Person("张三",11));
08
        hs.add(new Person("张三",12));
09
        hs.add(new Person("李四",13));
10
        hs.add(new Person("王五",14));
11
        hs.add(new Person("张三",11));
12
        show(hs);
13
    }
14
    public static void show(HashSet hs)
15
    {
16
        Iterator it=hs.iterator();
17
        System.out.println("\n\n\n");
18
        System.out.println("验证输出:");
19
        while(it.hasNext())
20
        {
21
            Person p=(Person)it.next();
22
            System.out.println(p.getName()+":"+p.getAge());
23
        }
24
    }
25
}
26
public class Person
27
{
28
    private String name;
29
    private int age;
30
    public Person(String name,int age)
31
    {
32
        this.name=name;
33
        this.age=age;
34
    }
35
    public Person(){}
36
    public String getName()
37
    {
38
        return name;
39
    }
40
    public int getAge()
41
    {
42
        return age;
43
    }
44
}
关于这段代码,输出结果是:
验证输出:
张三:12
王五:14
张三:11
张三:11
李四:13



我的疑惑是为什么HashSet容器会插入成功两个相同的对象?HashSet在添加对象的时候会计算它们的hashCode(),然后找到这个地址,看看对象是否已经存在,如果存在的话就表明冲突了,如果冲突了就先调用equals()方法比较两个对象是否相同,如果相同的话就不添加这个对象,如果不相同的话,就采用解决冲突的办法将冲突的对象添加到容器中。这个原理大概大多数人都知道,但是我不理解为什么上面的例子会插入成功?是equals()方法上出了问题吗?equals()方法应该是继承了object类的方法吧?如果是这样的话比较的应该是对象的内容而非地址吧?很明显,两次创建的对象是相同的,于是问题就出来了:为什么会添加成功第二个 张三 11呢?

2 个回复

倒序浏览
你的那个Person类要重写equals()和hashCode()方法,且这两个方法的返回值要一致,也就是判断数据相等的标准要一样。只有这样才能保证添加的数据不重复!
回复 使用道具 举报
hashset保证元素唯一性的标准是hashcode()方法跟equals()方法
首先会去判断两个对象的哈希值 如果你没有复写hashcode()方法的话 那么即使对象的内容一模一样
每一个new出来的对象的哈希值都是不一样的,那么相同内容的一样能存储进去,
如果复写了hashcode()那么当判断了哈希值相同的时候就会进而判断是否为同一个对象 那么就会开始判断
equals()  默认的Object类中的equals()方法比较的是地址值 每一个对象的地址值也是默认不同的 所以
需要根据自己的需求复写这个方法 当复写完成上面两个方法之后 就可以依据你复写的方法
来判断元素是否重复,如果重复则不存入,从而保证元素的唯一性
这两个方法是hashset保证元素唯一所必须复写的 放弃其中任何一个都不能确定保证元素的唯一性
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马