码迷,mamicode.com
首页 > 其他好文 > 详细

集合04_Set

时间:2018-09-29 21:29:08      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:object   容量   shc   java   好的   应该   rgs   this   png   

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

标签:object   容量   shc   java   好的   应该   rgs   this   png   

原文地址:https://www.cnblogs.com/pycrab/p/8933313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!