Set
set:无序不可重复。
无序:不保证有序
不可重复:不能添加重复元素
TreeSet
TreeSet:底层是红黑树,会自动排序。意味着里面存储的数据必须是相同类型的数据。
排序规则:
1.数字:从小到大
2.字符串:每一位ASCII值
3.日期:自然日期。 昨天、今天、明天、后天....
常用方法
Comparable
为社么可以自动调用排序?
答:因为添加的数据都实现了Comparable接口
如果我们要添加的数据为自定义类型,则需要让该类也实现Comparable接口并实现compareTo方法。
例如:
Comparator
使用场景:
场景1:使用TreeSet保存数字类型(Integer)类型,此时由于Integer实现了Comparable接口,并且是按数值大小进行升序排序,假如我们需要降序排序,怎么办?
场景2:使用TreeSet保存的数据,并没有实现Comparable接口,这样是存不进去的。怎么解决?
以上俩个场景,可以使用Comparator接口解决,只要使用Comparator之后,不管原来是否实现Comparable,都会按照Comparator进行排序。Comparator优先级较高
List排序
如果需要List排序也是可以的,Collections类中,有一个sorts方法可以进行排序
HashSet
HashSet 底层是散列表
常用方法:
散列表
概述
散列表又称哈希表,是在数组中保存的单向链表。
hash算法:是一种安全的加密算法,可以把不定长数据改为定长数据,并且不保证其唯一性。其中包括的算法有:直接寻址法,数字分析法,平方取中法,折叠法,随机数法,除留余数法。
Map
继承体系
Map特性:无序、key不可重复、value可重复。保存的是key和value的键值对
Node:1.key 2.value 3.next 4.hash
添加过程:
1.添加数据时(key value),调用key的hashCode方法,生成哈希值,然后通过hash算法得到数组下标
2.如果该下标对应的空间中没有数据,就创建一个Node对象,把key和value键值对放进去,保存到对应的下标上
3.如果下标对应的控件中有数据,则调用key的equals方法和空间中所有的数据进行对比。如果没有相同的,则创建一个Node对象,保存在这个单向链表的尾。如果equals判断有相同的,则不添加对应的Key,value直接替换原来的value。
注意:1.8开始,为了提高查询效率,对链表进行了优化,如果数组对应的链表中的数据大于等于7(第八个),会把链表转化为红黑树。
HashMap
在使用hashSet 和 hashMap的时候,想要代表对象的唯一性,需要同时覆写hashCode方法和equals方法
TreeMap
和treeSet使用方式一样,只不过添加的时候需要使用put 需要添加键值对.
泛型
概述
泛型:编译时进行类型检查。可以限制类型统一,并且编译时进行类型校验,不符合条件的不能使用。
使用方式
注意 :泛型不能是基本数据类型,要使用包装类。
自定义泛型
E:element的简写,一般代表元素,而集合中或者数组中的数据,我们称为元素。
K V:表示的是键值对,一般在map中存储
N:Number 数字
T:type 表示具体的一个Java类型
?:表示不确定的类型
如果规定了泛型,但是不设置泛型的话,则默认为Object
使用方式
面试题
在Map中以value排序。
Map中没有办法按照value排序的,因为在源码中写死了,它使用keyj进行比较,所以保存到List中进行排序。