集合04_Set

Posted pycrab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合04_Set相关的知识,希望对你有一定的参考价值。

Set集合总览

集合元素无序、不重复,三个实现类都是线程不安全的,最好在创建时通过Collections工具类的synchronizedSortedSet方法来包装Set集合,防止对set集合的意外非同步访问。

HashSet类

  1. 底层数据结构是哈希表(是一个元素为链表的数组) 和红黑树,按Hash算法存储元素,具有很好的存取和查找性能
  2. 判断相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法的返回值也相等
  3. 如果需要重写equals方法,则也需要重写hashCode方法,保证对象相等(HashMap也是)
  4. 核心要点如下:
    • 集合元素可以为null
    • 不保证迭代顺序
    • 初始容量影响迭代性能
    • 底层封装了HashMap,操作HashSet实际是操作HashMap
    • 使用HashMap的put方法,同时使用了==和equals方法判断键是否相等,仅修改了无用的value值,因此对相同元素根本没插入

LinkedHashSet类

  1. 底层数据结构是哈希表和双向链表
  2. 根据元素的hashCode值决定存储位置,使用链表维护次序,以插入顺序保存,在迭代访问全部元素时有很好的性能
  3. 核心要点如下:
    • 集合元素可以为null
    • 保证迭代顺序
    • 迭代双向链表,初始容量不影响性能
    • 需要维护双向链表,性能略差于HashSet
    • 底层封装了HashMap和双向链表

EnumSet类

  1. 元素为同类型的枚举值,有序,在内部以单位向量的形式存储,占内存小,运行效率好,尤其是进行批量操作时。
  2. 不允许加入null值,应该通过提供的类方法创建对象。

TreeSet类

  1. 底层数据结构是红黑树(是一个自平衡的二叉树),集合元素按大小排序
  2. 判断相等的标准是通过compareTo方法比较返回0
  3. 核心要点如下:
    • 集合元素不允许为null
    • 由于每添加一个元素都要调用该对象的compareTo(Object obj)方法与集合中其他元素比较,所以TreeSet只能添加同一种类型的对象
    • 底层封装了TreeMap
  4. 提供多种方法,如:
    • Object first()
    • Object last()
    • Object lower(Object e)
  5. 利用lambda表达式定制排序

    import java.util.TreeSet;
    
    public class Customer {
    private String name;
    private int age;
    
    public Customer(int age) {
        this.age = age;
    }
    
    public String toString() {
        return "[Customer:" + age + "]";
    }
    public static void main(String[] args) {
        TreeSet<Customer> tsCustomers = new TreeSet<>((o1,o2) -> {
            Customer c1 = (Customer)o1;
            Customer c2 = (Customer)o2;
            return c1.age > c2.age ? -1
                    :c1.age < c2.age ? 1 : 0;
        });
    
        tsCustomers.add(new Customer(10));
        tsCustomers.add(new Customer(20));
        System.out.println(tsCustomers);
    }
    }

    输出结果为:
    技术分享图片

以上是关于集合04_Set的主要内容,如果未能解决你的问题,请参考以下文章

Python_Day_04 set方法总结

5.04_集合框架(Map集合)

[Aizu] ITP2_9_A~D: Set Operation

比较 C# 中的字符串片段并从集合中删除项目

集合类不安全_List_Set_HashMap

Python__16--集合