Set 接口

本文介绍了Java中的Set接口及其三种主要实现类:HashSet、LinkedHashSet和TreeSet。HashSet提供高效的无序存储,而LinkedHashSet在保持插入顺序的同时牺牲了性能。TreeSet则按排序顺序存储元素,适合需要有序集合的场景。每个类都要求元素实现equals()和hashCode()方法。此外,文章还涉及了Map接口、HashMap的内部结构、哈希冲突解决策略以及JDK1.8中引入的红黑树优化。
摘要由CSDN通过智能技术生成

Set接口
无序、不允许重复
具体实现类
HashSet不保证元素的添加顺序,底层采用哈希表算法,查询效率高
判断两个元素是否相等equals() 方法返回为 true要求hashCode() 值必须相等
要求存入 HashSet 中的元素要覆盖 equals() 方法和 hashCode()方法
LinkedHashSet是HashSet的子类,在HashSet的基础上添加了额外的链表,底层采用了哈希表算法以及链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于HashSet
判断两个元素是否相等equals() 方法返回为 true要求hashCode() 值必须相等
要求存入 HashSet 中的元素要覆盖 equals() 方法和 hashCode()方法
TreeSet不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用红-黑树算法(树结构比较适合查询),但是添加的效率较低
存放的元素需要进行大小比较,所以类必须实现Comparable接口。必须同一类型

各种Set集合性能分析
HashSet和TreeSet是Set集合中用得最多的集合。HashSet总是比TreeSet集合性能好,因为HashSet不需要额维护元素的顺序。
LinkedHashSet需要用额外的链表维护元素的插入顺序,因此在插入时性能比HashSet低,但在迭代访问(遍历)时性能更高。因为插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。
EnumSet元素是所有Set元素中性能最好的,但是它只能保存枚举类型的元素。

相关的集合计算
addAll将指定集合中的所有元素都添加到此集合中,如果在进行此操作的同时修改了指定的集合,那么将不能保证操作的正确性
removeAll从指定的集合中移除包含在另一个集合中的元素,返回值为boolean,如果包含了要移除的对象则返回true否则false
retainAll仅仅保留集合中同时包含在指定集合的对象,其它的全部移除
containsAll用来查看在该集合中是否存在在指定集合中的所有对象,返回true表示存在,否则false

Collection和Collections的区别
Collection是java.util下的接口,它是各种集合的父接口,继承于它的接口主要有Set 和List
Collections是个java.util下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

习题
用程序给出随便大小的10 个整数,序号为1-10,【序号是存储时产生的序号】按从小到大顺序输出,并输出相应的序号
1、定义类用于封装产生的序号和对应的数据。
2、因为需要对数据进行排序,则必须是可比较的。实现方法可以是类实现Comparable接口,还可以额外定义比较器

3、生成数据并存入到TreeSet中即可 方法1

存储到List中进行排序 方法2

由于contains存在性判定需要使用equals方法,所以需要在Num类添加equals方法

存储在List中使用自定义比较器,类并没有实现Comparable接口 方法3

Map接口
哈希表就是一种以键-值(key-indexed) 存储数据的结构,只要输入待查找的值即key,即可查找到其对应的值。

哈希的思路很简单,如果所有的键hashCode都是整数,那么就可以使用一个简单数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。
简单的计算方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值