HashSet集合---HashCode方法与equals方法

HashSet集合---HashCode方法与equals方法

概述

当我们向有序集合(例如ArrayList)里面添加元素的时候,我们不用对元素有什么特别要求,集合可以通过下标对不同元素进行区分,但是,当我们向无序集合里面添加元素(例如HashSet),由于集合是无序的,系统不能通过下标对不同的元素进行区分,此时,需要通过某些方法对集合的不同元素进行区分——HashCode()与equals()。

关于HashSet

这个集合属于无序集合,集合里面不能存入相同元素(即使是两个内容相同的不同对象也不可以),每当你向集合里面添加元素,系统都要判断一下该元素与集合里的元素是否重复,如果你向集合里面添加的元素是java原本有的对象,他们一般都自带了判定方法,如果你向集合里面添加的是自定义的对象,那么,你需要提供方法让系统可以判定元素是否重复。此时,你要做的事情就是:在你的自定义对象里面(就是你自己写的类),复写题目所写两个方法。 


方法原型以及比较原则

1,HashCode方法原型:public int hashCode()//该方法返回一个整数值,就是所谓的哈希码值,当你添加一个自定义的对象进入集合,集合就会调用这个方法(调用你复写的这个方法),获取当前对象所对应的哈希码值。

2,equals方法原型:public boolean equals(Object object)()//相同返回true,否则返回false。

3,比较原则:

    (1)当自定义对象存入集合,将先调用HashCode方法,如果得到哈希码值与集合内任一元素哈希码值没有重复,认为元素不是相等,直接存入,此时忽略equals方法。

    (2)如果得到哈希码值有所重复,调用equals方法,如果得到true,认为重复,不得存入,否则认为可以存入。由此我们可以看出,HashCode方法相等,不能完全说明对象相等,当HashCode方法返回了相同值,将会调用equals()方法作进一步确认。

4,基于上述比较原则,当你复写这两方法那时,应该做到:

  (1)同一对象每次调用hashCode()必须得到同一样的哈希码值,不然你复写该方法没意义了。

  (2)不同对象调用hashCode()方法说得到的哈希码值,可以相同,也可以不同,这个没有硬性规定。

    为什么要做到以上两点?这是为了能够适应比较原则:由于同一对象每次调用HashCode()方法,所得到的哈希码值是一样的,所以如果所得到的哈希码值不同,说明不是一个对象,这满足了第一个的比较原则,不同对象调用HashCode()方法所得到的哈希码值,可以相同,可以不同,所以当得到的哈希码值相同,还要调用equals()方法,这满足了第二个的比较原则。

四,我们应该如何重写那两方法:这个根据你自定义的那个类而定,这里提供一个例子。

class Person//这是一个自定义类
{
    private String name;
    private int age;


    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }


    public String getName()
    {
        return this.name;
    }
    public int getAge()
    {
        return this.age;
    }


    public boolean equals(Object obj)
    {
        if( !(obj instanceof Person) )
            return false;
        Person p = (Person)obj;
            return this.name.equals(p.getName())&&this.age==p.getAge();
    }


    public int hashCode()
    {
        return this.name.hashCode()+this.age;//姓名和年龄均相同的人才会得到同一样的哈希码值
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值