java-----set集合

一、Set 接口

 

  1. Set 接口是 Collection 的子接口,相当于数学上的集合

  2. Set 存储元素的特点:

    • 不允许元素重复,尝试添加相同元素,会返回false

    • 不会记录元素的先后添加顺序

    • 判断两个元素对象是否相等用的是equals 方法

  3. hash 表与 数组对比

 

二、HashSet

 

  1. HashSet 是 Set 最常用的接口,底层使用 Hash(散列) 算法,查询速度和插入速度较快。

  2. HashSet 判断两个对象是否相等,equasl 比较。返回 true 表示相等。

  3. 对象的 HashCode 值决定了在hash 表中的位置。

    • 判断添加对象和集合元素对象HashCode值。

      • 不等:直接将新添加对象存储导对应位置

      • 相等:再继续判断新对象和集合中对象的具体值,equals 方法判断

        • HashCode 相同,equals true ,则是同一个对象,则不保存hashtable 中

        • HashCode 相同,equasl false,存储到同槽的链表上。

  4. HashSet 基于 HashMap 实现的

    //直接使用HashMap写好的代码,体现了封装的原则,减少重复代码
    private transient HashMap<E,Object> map;
    //map.put value 永远设置同一块空间 new Object 的静态常量
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    //得到 HashMap 的 key
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
  5. 注意:记得重写 equals 和 hashCode 方法

三、LinkedHashSet

  1. 底层使用哈希表算法,和链表算法,

    • 哈希表用来保证唯一性,HashSet 里面是不记录添加先后顺序的。

    • 链表,来记录元素的添加顺序

  2. 底层基于LinkedHashMap 实现

    public LinkedHashSet() {
        super(16, .75f, true);
    }
    ​
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }   

四、TreeSet

 

  1. TreeSet:底层使用红黑树算法,会对存储的元素做自然排序(小-大)

  2. 注意:使用TreeSet 时,必须使用同一种数据类型。因为需要比较,否则就会报类型转换异常

    • 底层肯定实现了Comparable 接口

    • 比较结果

      • 大于0

      • 等于0 则说明是同一个对象

      • 小于0

  3. 底层都是基于 TreeMap 实现的

    //底层使用 treeMap 
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }
    //可以传一个自定义比较器
    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

五、Collections集合工具类

  1. 常用方法

    //获取线程安全的集合
     Collections.synchronizedList(new ArrayList());
    //获取线程安全的集合
    Collections.synchronizedCollection(Collection);
    //排序,好用
    public static <T extends Comparable<? super T>> void sort(List<T> list) {
        list.sort(null);
    }
  2. 其它常用

    public static final List EMPTY_LIST = new EmptyList<>();
    public static final Map EMPTY_MAP = new EmptyMap<>();
    public static final Set EMPTY_SET = new EmptySet<>()  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值