增加java基础——hashSet中存放对象的比较规则

来源:互联网 发布:java内部类ppt 编辑:程序博客网 时间:2024/04/29 01:37

只有不断找寻机会的人才会及时把握机会。

在项目中,用的集合对象大部分是List和Map,但是Set这个对象却比较少用,突然有一天,我想起来,本来想敲个demo的,但是已经忘记里面的存放对象的规则了,那么今天我们来一起复习一下吧!

Set对象是Collection的一个子类,它的特点在于不能存放于重复的对象,什么叫做重复,重复的规则又是怎么定的呢?重点来了,我们今天就来看hashSet重复的规则。

hashSet中维护了一张哈希表,所以是按你对象的hashCode的值来判断你是否是同一个对象的,然后再去判断equals方法,然后才会判断你是不是相同的对象。

那么接下来,我们自己写个Demo出来复习一下吧。

我们来写一个判断动物是不是同一只动物,如果他的年龄和名字都相同的话我们就判断他的同一只动物,重点是什么呢?就是重写hashCode()和equals()方法。
看下我们的animals类:

public class Animals {    private String name;    private int age;    public Animals(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Animals{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    @Override    public int hashCode() {        return new Integer(this.getAge());    }    @Override    public boolean equals(Object obj) {        if(obj==null){            return false;        }        if(obj!=null && obj.getClass() == this.getClass()){            Animals animals = (Animals) obj;            return this.getName().equals(((Animals) obj).getName()) && this.getAge() == ((Animals) obj).getAge();        }        return super.equals(obj);    }}

然后看下我们的执行代码:

public class SetMain {    public static void main(String[] args){        Set<Animals> set = new HashSet<>();        Animals animals1 = new Animals("熊猫", 21);        Animals animals2 = new Animals("熊猫", 20);        set.add(animals1);        set.add(animals2);        Iterator<Animals> iterator = set.iterator();        while(iterator.hasNext()){            Animals animals = iterator.next();            System.out.println(animals.toString());        }    }}

看,我们equals中判断的是如果这两只动物的名字和年龄都相同的时候才能判定同一只动物,这里我们的执行代码是年龄不同的,所以应该输出两只动物,我们看下执行结果:

Animals{name='熊猫', age=20}Animals{name='熊猫', age=21}

怎么样,我们是不是达到我们预期的效果了呢?
现在我们改成相同的年龄看看能不能达到我们想要的效果:

public class SetMain {    public static void main(String[] args){        Set<Animals> set = new HashSet<>();        Animals animals1 = new Animals("熊猫", 20);        Animals animals2 = new Animals("熊猫", 20);        set.add(animals1);        set.add(animals2);        Iterator<Animals> iterator = set.iterator();        while(iterator.hasNext()){            Animals animals = iterator.next();            System.out.println(animals.toString());        }    }}

看下执行结果:

Animals{name='熊猫', age=20}

Ok,搞定,有没有一种拾忆的感觉呢,那么熟悉有那么陌生,那么我只能说,骚年,回家好好复习java基础吧。。。。。。。。。。。。。。
代码很简单,只要多练习就能完成,加油!!!!

0 0