JavaSE进阶-集合(三)

    HashSet集合               【重点】
    Map集合                   【重点】
    HashMap集合              【重点】
    TreeMap集合              【了解】
    可变参数                  【重点】

HashSet集合               【重点】
    特点:
        1、不能保证存取有序
        2、没有索引
        3、不能存储重复元素
    里面没有要学习的特有方法,所有使用的方法还是Collection接口中的那些方法

    HashSet存储字符串

    HashSet存储学生对象
        观察:
            1、直接将学生对象存储到HashSet集合中没有做任何操作,是否会运行报错?
                不会报错
            2、是否达到了去重效果?
                没有,多个成员变量相同的对象都存储到了集合中
                如何做到去重?
                    在元素对象所在的类中,生成(重写)hashCode和equals方法,
                    生成之后HashSet就会做到我们想要的去重效果
                    我们认为对象中的成员变量都相同是同一个,应该去重
            3、是否依然无法保证有序?
                是的


    哈希值
        是一个int类型的值,所以范围也在int范围
        可以通过hashCode方法可以进行获取,hashCode方法是Object类中的方法,如果没有重写hashCode方法,
        获取的哈希值可以反映对象的地址值,但是如果重写了就和地址值无关,一般和对象中的成员变量有关


        同一对象(地址相同),多次调用hashCode方法计算的哈希值一定相同
        不同的对象(地址不同),多次调用hashCode方法计算的哈希值可能相同,也可能不同

        ——>哈希值不同的一定不是同一个对象,哈希值相同的可能是同一个对象,也可能不是同一个对象

    HashSet去重的原理(HashSet保证元素唯一的原理)
        底层依赖的是hashCode和equals方法,通过这两个方法的配合使用,达到去重的效果

        首先调用hashCode方法计算哈希值,根据哈希值计算元素在底层数组中存储的位置,如果该位置为null,
        则说明当前要存储的元素与集合中已存储的所有元素的哈希值不同,此时直接存储。但是如果该位置不为null,
        则说明当前要存储的元素和集合中已存储的元素哈希值相同,此时无法确定是否是同一个元素,那么要调用equals
        方法进一步确定,如果equals方法判断不相同,则说明不是相同元素,则存储,如果equals方法判断相同,
        则说明是相同元素,则不存。

    总结:
        1、能够使用HashSet存储简单类型元素(String、Integer),这些也可以称为JDK提供的类类型
            不用做任何操作,直接存储到HashSet中即可,就可以做到去重
            因为这些JDK提供的类类型底层已经重写了hashCode和equals方法,去重的时候和内容有关

        2、能够使用HashSet存储自定义类型元素(Student、Person)
            存储到HashSet中之后,还需要重写hashCode和equals方法,通过idea自动生成即可
            重写之后,去重的时候和内容有关

        3、能够描述HashSet的去重原理

    单列集合的总结
        体系结构
            Collection
                |-List
                    |-ArrayList
                    |-LinkedList
                    |-Vector
                |-Set
                    |-TreeSet
                    |-HashSet
        集合的选择
            1、看是否需要存储重复元素
                需要,只能选择List体系
                不需要/不能,选择Set体系
            2、List体系下选择哪个集合?
                ArrayList:底层是数组,查询修改快,增删慢
                LinkedList:底层是链表,查询修改慢,增删快
                Vector:底层是数组,查询修改快,增删慢

                Vector肯定不选,它基本上活在很老的代码和面试题中
                如果增删特别多,选择LinkedList
                其余情况都选ArrayList
                由于真实环境中,只有还是将集合当做一个临时中间容器使用,
                常见的操作是:存储进去之后,传递到下一层,然后取出元素,
                并且存储的数据一般不会很多,所以List体系下基本上都是使用ArrayList
            3、Set体系下选择哪个集合?
                TreeSet:底层是红黑树,可以对集合元素去重和排序
                HashSet:底层是哈希表,可以对集合元素去重,但是不能排序

                所以如果要去重且排序,选择TreeSet
                如果只是要去重,选择HashSet
                由于真实环境中,基本不会使用Java集合进行排序,以后都是通过数据库的SQL进行排序
                所以我们不会选择TreeSet,都选择HashSet

Map集合                   【重点】
    Map集合概述
        什么是Map集合
            Map是一个双列集合,存储的每一个元素由两列组成,
            第一列称为键(Key),第二列称为值(Value),
            Map集合存储的是键映射到值的对象,可以称为键值对

            单列
            add("hello");
            add("world");
            add("java");
            add("php");

            双列
                键       值
            put("zhangsan",24)
            put("lisi",15)
            put("wangwu",15)
        Map集合的特点
            1、Map的键和值是一一对应的,通过一个键最多只能找到一个值
            2、键不能重复,但是值可以重复
                如果键相同,则值覆盖(修改值)
            3、Map也没有索引,不能通过索引操作Map集合中的元素

        Map集合的体系结构
            Map接口
                |-TreeMap类
                |-HashMap类

    常用方法
            添加(修改值)
                V put(K key, V value):添加键值对数据,如果键相同此时有修改值的效果
                                       方法会返回被修改的旧值,如果没有修改(没有相同的键)则返回null

            删除
                V remove(Object key):根据键删除整个键值对,返回的是被删除的键值对对应的值
                void clear():清空集合
            判断
                boolean isEmpty():判断集合是否为空(判断集合是否有元素)
                boolean containsKey(Object key):判断是否有指定的键
                boolean containsValue(Object value):判断是否有指定的值

            获取
                 int size():获取集合的长度
                 Collection<V> values():获取所有的值的集合

                遍历
                V get(Object key):根据键获取对应的值
                Set<K> keySet():获取所有的键存储到Set集合中返回

                Set<Map.Entry<K,V>> entrySet()

                default void forEach(BiConsumer<? super K,? super V> action)

    遍历
        方式一:根据键获取值
            V get(Object key)
            Set<K> keySet()

            步骤:
                1、首先获取所有的键          keySet()
                2、遍历获取每一个键
                3、在遍历中根据获取的每一个键找到对应的值 get(K)
        方式二:根据键值对对象找键和值
              Set<Map.Entry<K,V>> entrySet()
             步骤:
                1、获取所有的键值对对象        entrySet()
                2、遍历获取每一个键值对对象
                3、根据键值对对象中的getKey()和getValue()方法分别获取键和值

        方式三:Map默认方法forEach方法
            default void forEach(BiConsumer<? super K,? super V> action)

HashMap集合              【重点】
    HashMap是Map接口的实现类,Map接口中的共性方法HashMap都可以使用
    HashMap没有要学习的特有方法。

    HashMap的特点:
        1、底层是哈希表结构,数据结构针对的是键,对值没有效果
        2、键不同重复、无法保证有序的、不能通过索引操作的
        3、HashMap键存储元素的特点和HashSet存储元素的特点一模一样
            因为HashSet底层使用的就是HashMap的键
            HashMap的键存储的自定义对象,我们需要重写hashCode和equals方法


TreeMap集合              【了解】
    TreeMap是Map接口的实现类,Map接口中的共性方法TreeMap都可以使用
    TreeMap没有要学习的特有方法。

    TreeMap的特点:
        1、底层是红黑树,数据结构针对的是键,对值没有效果
        2、键不同重复、无法保证有序的(排序)、不能通过索引操作的
        3、TreeMap键存储元素的特点和TreeSet存储元素的特点一模一样
            因为TreeSet底层使用的就是TreeMap的键
            TreeMap的键存储的自定义对象,我们需要指定自然排序规则或者比较器排序规则

可变参数                     [重点]
    什么是可变参数
        JDK5.0的新特性(自动拆装箱、增强for、泛型和可变参数等)
        表示参数的个数可以发生改变,形参只有一个,但是实参可以是0个、1个或多个

    可变参数的格式
        修饰符 返回值类型 方法名(参数列表) {
            方法体
        }

        可变参数只能使用在方法的形参处(参数列表)
        格式:
            数据类型... 变量名

    可变参数的注意事项
        1、可变参数的本质是一个数组
        2、如果一个参数是可变参数,既可以传递一个数组,也可以传递多个这种类型的数据
        3、一个方法的可变参数最多只能有一个,而且必须放在参数列表的最后
        4、可变参数只能使用在方法的形参处(参数列表)

    可变参数和数组的区别
        1、使用场景上
            可变参数只能使用在方法的形参处
            数组既可以使用在形参处,也可以和使用在方法内部定义局部变量,还可以使用类中方法外定义成员变量
        2、当做形参进行实参传递上
            可变参数,既可以传递一个数组,也可以传递多个这种类型的数据,还可以不传递(0个实参)
            数组,只能传递这种类型的数组,不能传递多个这种类型的数据,而且不能不传递

       总结:可变参数使用在形参处,可以比数组更加灵活

    带可变参数的方法的使用(不可变集合的创建和使用)
        List接口
            static <E> List<E> of(E... elements)
        Set接口
            static <E> Set<E> of(E... elements)
        Map接口
            static <K,V> Map<K,V> of(K k1, V v1)
            static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值