ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在Set集合中添加自定义的对象

2019-11-17 20:02:30  阅读:235  来源: 互联网

标签:kind Set return name 自定义 Dog 添加 hobby String


讨论的问题:众所周知,set集合的特点是无重复的元素。一般Java类库中的类型比如String 类在添加到set中后,是不会出现重复现象的。那么自定义的类呢?

1.创建自定义类

public class Dog {
    private String name;
    private String kind;
    private String hobby;
    
    public Dog(String name,String kind,String hobby) {
        this.hobby=hobby;
        this.kind=kind;
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public String getKind() {
        return kind;
    }

    public String getHobby() {
        return hobby;
    }

    @Override
    public String toString() {
        return "Dog [name=" + name + ", kind=" + kind + ", hobby=" + hobby + "]";
    }

2.测试

public class TestSet {

    public static void main(String[] args) {
        
        Set<Dog> dogs=new HashSet<>();
        
        Dog dog=new Dog("huahua","tianyuan","run");
        Dog dog1=new Dog("tiantian","hashiqi","eat");
        Dog dog2=new Dog("qiqi","jinmao","smell");
        Dog dog3=new Dog("qiqi","jinmao","smell");
        dogs.add(dog);
        dogs.add(dog1);
        dogs.add(dog2);
        dogs.add(dog3);
        System.out.println(dogs);
    }
}

3.结果:

[Dog [name=qiqi, kind=jinmao, hobby=smell], Dog [name=huahua, kind=tianyuan, hobby=run], Dog [name=tiantian, kind=hashiqi, hobby=eat], Dog [name=qiqi, kind=jinmao, hobby=smell]]

4.分析:

可以看到在结构中有两个重复的元素。

自定义类的情况下,需要重写hashcode()和equals()方法,Object中的equals()仅能判断两个对象是否具有相同的引用,不能判断对象的内容细节,所以需要重写。

Note:hashcode是根据类的实例域生成的一个随机的整数,可为负。只要两个对象相同,他们的hashcode码就相同。

5.改进:在Dog类中重写如下方法:

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((hobby == null) ? 0 : hobby.hashCode());
        result = prime * result + ((kind == null) ? 0 : kind.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Dog other = (Dog) obj;
        if (hobby == null) {
            if (other.hobby != null)
                return false;
        } else if (!hobby.equals(other.hobby))
            return false;
        if (kind == null) {
            if (other.kind != null)
                return false;
        } else if (!kind.equals(other.kind))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

6.结果:

[Dog [name=tiantian, kind=hashiqi, hobby=eat], Dog [name=qiqi, kind=jinmao, hobby=smell], Dog [name=huahua, kind=tianyuan, hobby=run]]

不再有重复的元素!

 

标签:kind,Set,return,name,自定义,Dog,添加,hobby,String
来源: https://www.cnblogs.com/liu-chen/p/11877759.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有