Java- Set及其实现类

Java- Set及其实现类

上一篇我们讲解了Collection接口的 子接口List 及其实现类(ArrayList 、LinkedList 迭代器) ,今天我们一起看看Collection的另一个子接口 Set

Set

  • Set 的实现类 基本都是使用了 对应的Map实现类 实现的。比如 HashSet 是基于 HashMap实现的,TreeSet是基于TreeMap实现的。
  • 具体如何实现?
    • Map存储的是键值对<key,value>,并且key不能重复 (value可以重复);Set 只使用了Map的Key位置存储数据,value的内容由java自动存放统一内容
HashSet
  • HashSet:使用哈希表的存储方式,HashMap实现;散列存放,无法保证原来的存储顺序
	public static void main(String[] args) {
        HashSet<String> set  = new HashSet<>();
       boolean flag1 = set.add("锄禾日当午");
        set.add("汗滴禾下土");
        set.add("谁知盘中餐");
        set.add("粒粒皆辛苦");
        boolean flag2 = set.add("锄禾日当午"); // 添加失败
        System.out.println(flag1);
        System.out.println(flag2);
        for(String s:set){
            System.out.println(s);
        }
        System.out.println("____________________");
        /*迭代器遍历set*/
        Iterator<String> iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

HashSet

TreeSet
  • TreeSet:使用二叉树的存储方式,由treeMap实现;有序(自然顺序、操作系统默认的顺序)
TreeSet<String> data = new TreeSet<>();
        //系统提供的数据 有序
        data.add("B");
        data.add("C");
        data.add("A");
        data.add("D");
        for(String s:data){
            System.out.println(s);
        }

TreeSet1


自己定义的类 要排序 必须实现 Comparable 接口 编写排序准则

  public static void main(String[] args) {
        TreeSet<People> data = new TreeSet<>();
        //自己定义的类 要排序 必须实现 Comparable 接口 编写排序准则
       People p1 = new People("张三",18);
       People p2 = new People("李四",20);
        //People p3 = new People("悠悠",20);
        //TreeSet不会存储一样的数据,p3不会被存储进去
       data.add(p1);
       data.add(p2);
       for(People p :data){
           System.out.println(p);
       }

    }
    //Comparable 比较此对象对传入对象进行比较
    static  class People implements Comparable<People>{
        private String name;
        private int age;

        public People(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 boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            People people = (People) o;
            return age == people.age &&
                    Objects.equals(name, people.name);
        }

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

        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }

        public People() {
            super();
        }

        @Override
        public int compareTo(People o) {
            //this 与 o比较
            //返回数据:负数 (this小)/ 零(一样大)/正数 this 大
            if(this.age>o.age){
                return 1;
            }else if(this.age<o.age){
                return  -1;
            }else{
                return 0;
            }

        }
    }

treeSet2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小白小小白小白鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值