集合(Day18)

Set

        set:无序不可重复。

        无序:不保证有序

        不可重复:不能添加重复元素

TreeSet

        TreeSet:底层是红黑树,会自动排序。意味着里面存储的数据必须是相同类型的数据。

        排序规则:

                1.数字:从小到大

                2.字符串:每一位ASCII值

                3.日期:自然日期。 昨天、今天、明天、后天....

        常用方法

集合(Day18)_第1张图片

        Comparable 

        为社么可以自动调用排序?

        答:因为添加的数据都实现了Comparable接口

        如果我们要添加的数据为自定义类型,则需要让该类也实现Comparable接口并实现compareTo方法。

        例如:

集合(Day18)_第2张图片

集合(Day18)_第3张图片

         Comparator

        使用场景:

        场景1:使用TreeSet保存数字类型(Integer)类型,此时由于Integer实现了Comparable接口,并且是按数值大小进行升序排序,假如我们需要降序排序,怎么办?

        场景2:使用TreeSet保存的数据,并没有实现Comparable接口,这样是存不进去的。怎么解决?

        以上俩个场景,可以使用Comparator接口解决,只要使用Comparator之后,不管原来是否实现Comparable,都会按照Comparator进行排序。Comparator优先级较高

集合(Day18)_第4张图片

        List排序 

        如果需要List排序也是可以的,Collections类中,有一个sorts方法可以进行排序

集合(Day18)_第5张图片

 

HashSet 

        HashSet 底层是散列表

        常用方法:

集合(Day18)_第6张图片

散列表 

        概述

        散列表又称哈希表,是在数组中保存的单向链表。

        hash算法:是一种安全的加密算法,可以把不定长数据改为定长数据,并且不保证其唯一性。其中包括的算法有:直接寻址法,数字分析法,平方取中法,折叠法,随机数法,除留余数法。

Map

        继承体系

集合(Day18)_第7张图片

        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方法

集合(Day18)_第8张图片

集合(Day18)_第9张图片

 

 TreeMap

        和treeSet使用方式一样,只不过添加的时候需要使用put 需要添加键值对.

集合(Day18)_第10张图片

 泛型

        概述

        泛型:编译时进行类型检查。可以限制类型统一,并且编译时进行类型校验,不符合条件的不能使用。

        使用方式

集合(Day18)_第11张图片

        注意 :泛型不能是基本数据类型,要使用包装类。

        自定义泛型

        E:element的简写,一般代表元素,而集合中或者数组中的数据,我们称为元素。

        K V:表示的是键值对,一般在map中存储

        N:Number 数字

        T:type 表示具体的一个Java类型

        ?:表示不确定的类型

        如果规定了泛型,但是不设置泛型的话,则默认为Object

        使用方式

集合(Day18)_第12张图片

面试题 

        在Map中以value排序。

        Map中没有办法按照value排序的,因为在源码中写死了,它使用keyj进行比较,所以保存到List中进行排序。

集合(Day18)_第13张图片

        

        

        

你可能感兴趣的:(数据结构,java)