Set和HashSet

Set

Set集合是Collection集合的子接口,该集合中不能有重复元素!!

Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法

Set接口,它有两个常用的子实现类HashSet,TreeSet

HashSet

HashSet实现了Set接口,底层是hash表(实际上底层是HashMap) 该类不允许重复元素,不保证迭代顺序,即无序(插入顺序和遍历顺序不一致)

构造方法

  • HashSet() 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16加载因子是 0.75

  • HashSet(Collection<? extends E> c)构造一个包含指定 collection 中的元素的新 set

  • HashSet(int initialCapacity) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。

  • HashSet(int initialCapacity, float loadFactor) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

方法:

HashSet类中的方法与父接口Set接口中的方法一致,跟Collection接口中方法一致

public static void main(String[] args) {
        // 创建HashSet集合
        HashSet<Integer> set = new HashSet<>( );

        // 放入元素
        boolean r1 = set.add(221);
        System.out.println(r1 );
        boolean r2 = set.add(221);
        System.out.println(r2 );
        set.add(111);
        set.add(111);
        set.add(44);
        set.add(23);

        // 遍历(for + Iterator)
        for(Integer i: set) {
            System.out.println(i );
        }

        // 总结: 顺序问题+ 重复问题
        // 无序即 插入顺序和迭代顺序不一致
        // 不允许重复!
        Iterator<Integer> iterator = set.iterator( );
        while(iterator.hasNext()) {
            Integer integer = iterator.next( );
            System.out.println(integer );
        }


        // 演示其他方法(移除,判断,大小等等)
        System.out.println(set.size() );
        System.out.println(set.isEmpty( ));
        set.clear();
        System.out.println(set.size() );
        System.out.println(set.isEmpty( ));

        HashSet<Integer> set2 = new HashSet<>( );
        set2.add(111);
        // 移除全部指定元素
        System.out.println(set.removeAll(set2));
        System.out.println(set );
    }

扩容机制:

HashSet底层是Hash表,其实是HashMap. 默认初始容量16,加载因子0.75 ---> 扩容的阈值= 容量 * 因子 = 16 * 0.75 = 12 即超过12个元素时就要触发扩容,扩容成原来的2倍

去重原理

  1. 调用add(E e)方法时,会在底层调用元素e的hashcode方法来获得对象的地址值

  2. 如果地址值不一样,直接存储

  3. 如果地址值一样时,会再调用元素的equals方法判断元素的内容是否一样

  4. 如果equals为false,那么存储 但是如果equals判断值为true,那么去重

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值