前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java——类集框架:Set集合接口的详解及应用举例

Java——类集框架:Set集合接口的详解及应用举例

作者头像
Winter_world
发布2020-09-25 10:10:04
3720
发布2020-09-25 10:10:04
举报

1、Set集合口

Set也是Collection的子接口,主要特点是保存的数据不允许出现重复。但Set子接口并不像List子接口那样,针对Collection接口进行扩展,而是完整按照Collection接口标准实现了继承,所以没有get方法。

Set子接口有两个常用子类:TreeSet(有序)、HashSet(无序)。

【举例】:观察HashSet子类:HashSet最大特点是不允许保存重复元素,且无序排列。

代码语言:javascript
复制
        Set<String> all = new HashSet<String>();
        all.add("Hello");
        all.add("World");
        all.add("good");
        all.add("dog");
        all.add("cat");
        all.add("Hello"); //重复元素不保存
        System.out.println(all);

【举例】:观察TreeSet子类:数据不允许重复,根据升序排列

代码语言:javascript
复制
        Set<String> all = new TreeSet<String>();
        all.add("Hello");
        all.add("World");
        all.add("good");
        all.add("dog");
        all.add("cat");
        all.add("Hello");
        System.out.println(all);

2、关于TreeSet排序

可以使用自定义类作为保存数进行排序,但是一定要实现Comparable接口,以作为排序的依据。而在实现Comparable接口时,需要将所有属性参与到比较中,具体查看下面的compareTo方法,若只写return this.age-o.age,则运行输出,发现只有张三和赵五,年龄相同李四没有了。

代码语言:javascript
复制
        Set<Person> all = new TreeSet<Person>();
        all.add(new Person("张三",10));
        all.add(new Person("赵五",12));
        all.add(new Person("李四",10));
        all.add(new Person("赵五",12));
        System.out.println(all);

class Person implements Comparable<Person>{

        private  String name;
        private int age;

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

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}' ;
        }

        @Override
        public int compareTo(Person o) {
            if(this.age > o.age){
                return 1;
            }else if(this.age < o.age){
                return -1;
            }else{
                return this.name.compareTo(o.name);
            }
        }

        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;
        }
    }

只要Java中牵扯到一组对象的排序操作,永远要使用Comparable接口完成,上例中可以看出,使用TreeSet进行排序,需要将所有属性参与到比较中,比较麻烦,所以一般很少用TreeSet进行比较操作,多用HashSet。

3、关于重复元素

Comparable只是适合于TreeXX类型的集合消除重复元素,而真正意义的重复判断不是利用Comparable接口完成,而是利用Object类的两个方法完成:

  • 取得对象的hash码:public int hashCode();
  • 对象比较:public boolean equals(Object obj);
代码语言:javascript
复制
        Set<Person> all = new HashSet<>();
        all.add(new Person("张三",10));
        all.add(new Person("赵五",12));
        all.add(new Person("李四",10));
        all.add(new Person("赵五",12));
        System.out.println(all);

class Person{

        private  String name;
        private int age;

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

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}' ;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Person person = (Person) o;
            return age == person.age &&
                    name.equals(person.name);
        }

        @Override
        public int hashCode() {
            return Objects.hash(name, 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;
        }
    }

4、小结

1)Set接口重复数据消除依靠的是子类实现,HashSet基于hashCode()、equals(),TreeSet基于Comparable接口。

2)开发中很少用TreeSet,基本用的是HashSet。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Set集合口
    • 2、关于TreeSet排序
      • 3、关于重复元素
        • 4、小结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档