5.Set接口与实现类

Set接口与实现类

Set子接口

概述

  • 特点:无序,无下标,元素不可重复

  • 方法:全部继承自Collection中的方法

Set接口的使用

package com.jhkj.set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * set方法的使用
 */
public class Demo1 {
    public static void main(String[] args) {
        // 创建集合
        Set<String> set = new HashSet<>();
        // 1.添加数据
        set.add("华为");
        set.add("小米");
        set.add("苹果");
        System.out.println("元素个数" + set.size());
        System.out.println(set.toString());
        // 2.删除数据
        set.remove("华为");
        System.out.println(set.toString());
        // 3.遍历数据
        System.out.println("--------使用增强for----------");
        for (String s : set) {
            System.out.println(s);
        }
        System.out.println("-------使用迭代器------------");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        // 4.判断
        System.out.println(set.contains("华为"));
        System.out.println(set.isEmpty());
    }
}

Set实现类

注意:使用什么比较就可以重写什么方法

  • HashSet:
    • 存储结构:哈希表 (数组 + 链表 + 红黑树)
    • 存储过程:(重复依据)
        1. 根据Hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空则执行第二步
        2. 再执行equals方法,如果equeals方法为true,则认为是重复,否则,形成链表
    • 基于HashCode计算元素存放位置
    • 当存入元素的哈希码相同时,会调用equals进行确认,若结果返回true,则拒绝后者存入
  • TreeSet:
    • Comparable(可比较) Comparator(比较器)
    • 存储结构:红黑树
    • 要求:
        1. 元素(类)必须要实现Comparable接口
        2. 判断 如果compareTo() 方法的返回值为 0 ,则认识是重复元素
    • 基于排列顺序实现元素不重复
    • 实现了SortedSet接口,对集合元素自动排序
    • 元素对象的类型必须实现Comparable接口,指定排序规则
    • 通过CompareTo方法确定是否为重复元素

实现比较器

package com.jhkj.set;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * Comparator 比较器
 * Comparatble 可比较的
 * 使用Comparator实现可定制的比较器
 */
public class Demo6 {
    public static void main(String[] args) {
        // 创建对象
        TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int n1 = o1.getName().compareTo(o2.getName());
                int n2 = o1.getAge() - o2.getAge();

                return n1==0?n2:n1;
            }
        });

        Person p1 = new Person("xyz", 11);
        Person p2 = new Person("hello", 12);
        Person p3 = new Person("zero", 13);

        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println("元素个数:" + set.size());
        System.out.println(set.toString());
    }
}

使用TreeSet集合实现字符串按照长度进行排序

package com.jhkj.set;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * TreeSet案例
 * 使用TreeSet集合实现字符串按照长度进行排序
 */
public class Demo7 {
    public static void main(String[] args) {
        TreeSet<String> strings = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int n1 = o1.length() - o2.length();
                int n2 = o1.compareTo(o2);
                return n1==0?n2:n1;
            }
        });

        strings.add("beijing");
        strings.add("pingzi");
        strings.add("helloworold");
        strings.add("car");
        System.out.println("元素个数:" + strings.size());
        System.out.println(strings.toString());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值