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);
    }
    }

输出结果为:

最新文章

  1. 23种设计模式--工厂模式-Factory Pattern
  2. 【java】之 apache commons-codec 与Apache Digest demo实例,支持md5 sha1 base64 hmac urlencode
  3. web项目中的跨域问题解决方法
  4. 学习JQ
  5. C# 選擇本機檔案並上傳
  6. mysql给日期增减
  7. 淘宝的ip地址库
  8. 在WIN32 DLL中使用MFC库遇到的问题
  9. MVC 路由规则
  10. python模块与包
  11. Servlet的学习之Request请求对象(3)
  12. Python:generator的send()方法流程分析
  13. 201521123002《Java程序设计》第8周学习总结
  14. 爱pia戏推出PC客户端,为您自动置顶窗口,方便查找
  15. 记一个http-proxy-middleware 代理访问nginx映射的接口不通过的问题(connection close)
  16. FORTH基础
  17. Navicat远程连接阿里云服务器的mysql
  18. requests之一:HTTP请求 状态码
  19. 图表管理账单的NABCD
  20. css 小坑

热门文章

  1. 10.for
  2. 【转】基于Selenium的web自动化框架(python)
  3. zookeeper日志清理
  4. 【爬虫】biqukan抓取2.0版
  5. 财务自由VS精神自由
  6. plsql注册-转
  7. 20165305 苏振龙《Java程序设计》第三周学习总结
  8. Java基础整理
  9. Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法
  10. git从安装到使用