【Java】Java容器类(三),深入理解Set集合类
【Java】Java容器类(三),深入理解Set集合类
建议整个系列一起看(更新中):
增强for: https://blog.****.net/qq_45495857/article/details/109410980
泛型:https://blog.****.net/qq_45495857/article/details/109410912
容器篇(一),宏观了解:https://blog.****.net/qq_45495857/article/details/109524162
容器篇(二),深入理解List集合类: https://blog.****.net/qq_45495857/article/details/109529618
Set接口
继承自Collection
特点:
- 元素无序(存入和取出的顺序不一致)
- 元素不能重复(元素唯一)
- 没有索引
注意:
- 无序:指定的是存入的顺序和取出的顺序不一样,而不是说每次取出是随机顺序,存入后每次取出来的顺序都一样,但和存入的顺序不一样
- 直接打印和获取元素都属于取出,所以不要把打印当成是HashSet内部存储的样子
Set具有与Collection完全一样的 接口,因此没有任何额外的功能,不像前面有两个不同的List,实际上Set就是Collection,只是行为不同。
这是继承 和 多态思想的典型应用;表现不同的行为
HashSet
- 底层使用散列函数
- 专为快速查找而设计的Set
底层源码:
我们发现里面有个map属性,这就是HashSet的核心秘密。我们再看add()方法,发现增加一个元素说白了就是在map中增加一个键值对,键对象就是这个元素,值对象是名为PRESENT的Object对象。说白了,就是“往set中加入元素,本质就是把这个元素作为key加入到了内部的map中”。
由于map中key都是不可重复的,因此,Set天然具有“不可重复”的特性。
HashSet保证元素唯一性的原理
判断对象是否相同要根据2个方法:
hashCode()
- 如果判定哈希值不相同, 则认为不重复
- 如果判定哈希值相同, 则需要继续使用
equals()
方法判断
equals()
- 如果判定不相同, 则认为不重复
- 如果判定相同, 则认为重复
TreeSet
- 内部使用了红-黑树数据结构
- 自动排序
- 排序按照字典序进行
TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口
。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。
易错:
- 由于是二叉树,需要对元素做内部排序。 如果要放入TreeSet中的类没有实现Comparable接口,则会抛出异常:java.lang.ClassCastException。
- TreeSet中不能放入null元素。
LinkedHashList
- 同样使用到了散列,但是看起来使用了链表来维护元素的插入顺序
- 其他同HashSet
//以上就是本期Set集合的所有内容了,不对之处,欢迎各位大佬多多指点