Java学习--集合体系结构--set

图片来自黑马

1.set系列集合

Set接口中的方法基本上与Collection的API一致,所以直接使用collection的方法即可

1.特点

  • 无序:存取顺序不一致
  • 不重复:可以去除重复(当set系列集合使用add方法添加数据时,不能重复,若重复,方法返回一个false,此重复数据不存入
  • 无索引:没有带索引的方法,所以不能用普通for循环遍历,也不能通过索引来获取元素
  1. 实现类
  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:可排序、不重复、无索引

2.HashSet

请添加图片描述

  • HashSet集合底层采取哈希表存储数据
  • 哈希表由数组+链表+红黑树组成(jdk8之前没有红黑树)

2.1 哈希值

对象的整数表现形式

  • 根据HashCode方法算出来的int类型的整数
  • 该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
  • 一般情况下,会重写HashCode方法,利用对象里的属性值计算哈希值
特点
  • 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
  • 相反,若重写了方法,只要属性值相同,不同对象计算出来的哈希值是一样的
LinkedHashSet

图片来自黑马

与Hash Set相比,linkedhashset的取出存入顺序是一致的

原理::底层数据依然是哈希表,只不过每个元素多了一个双链表就机制记录存储的顺序

总结:去重默认选择HashSet,如果要求去重且要求存取有序,才使用用LInkedHashSet

2.2 TreeSet

  • 不重复、无索引、可排序(按照元素的默认规则–从小到大 排序)
  • TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好
  • 对于字符、字符串类型,按照字符在ASCII码表中的数字升序进行排序
  • 字符串比较:逐个比较

2.2.1TreeSet的两种比较方式

  1. 默认排序/自然排序:Javabean类是实现Comparable接口指定比较规则
  • 需要重写compareto方法,规定排序规则

返回值(依据红黑树的存取规则
负数:认为要添加的元素是小的,存左边
正数:认为要添加的元素是大的,存右边
0 :认为要添加的元素已经存在,舍弃

  • 不需要重写hashCode和equals方法,因为前两者是跟哈希表有关的,TreeSet集合底层是红黑树

2.比较器排序:创建TreeSet对象的时候,传递比较器Comparator指定规则

在创建集合时。直接在小括号内 new 一个 comparator

总结

  1. 如果想要集合中的元素可重复
    • 用ArrayList集合,基于数组的(用的最多)
  2. 如果想要集合中的元素可重复,且当前的增删操作明显多于查询’
    • 用LinkedList集合,基于链表的
  3. 如果想要对集合中的元素去重
    • 用HashSet集合,基于哈希表的(用的最多)
  4. 如果想要对集合中的元素去重,并且保证存储循序
    • 用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet
  5. 如果想对集合中的元素进行排序
    • 用TreeSet集合,基于红黑树。后续也可以用List集合实现排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值