集合 set list ArrayList linkedList

1.List
    ArrayList
        ArrayList集合 底层是数组
            长度可变的数组 默认长度是10
            超过后 就会创建一个新的数组 50%延长 变成15
            将原来的数据拷贝过来 再加入新的元素

            特点:
                查找和修改快 增删比较慢
        注意事项:
            Collection中的
                contains方法 判断是否包含 底层依赖于 equals方法
                remove方法  判断是否删除 底层依赖于 equals方法
    LinkedList
        LinkedList集合 底层是双向链表
            特点:
                查找和修改慢 增删比较快
            特有功能:
                addFirst(Element) 将指定元素插入到此列表的开头
                addLast(Element) 将指定元素插入到此列表的结尾
                getFirst() 返回此列表的第一个元素
                getLast() 返回此列表的最后一个元素
                removeFirst() 删除并返回此列表的第一个元素 
                removeLast() 删除并返回此列表的最后一个元素
            版本升级之后
            getFirst() 变成了 peakFirst()
            removeFirst() 变成了 pollFirst()
    ArrayList 和LinkedList的使用场景?
        通过验证 发现在添加数据方面 LinkedList比ArrayList快

        ArrayList 是一个长度可变的数组 插入数据时 需要先将原始数组的数据复制到一个新数组中
            然后再去插入新的数据
        LinkedList 是双向链表 相互引用的阶段组成的链表结构
            当数据插入到链表中的某一个位置时
            将链表中要插入位置前后的链表指向进行改变
    Vector
        Vector集合 底层是数组
        Vector 和 ArrayList使用方法一样
        遍历方式不同
            Enumeration<E> elements() 
            枚举遍历 只能是Vector使用 高版本的List集合无法使用
            实际开发中 使用近乎都是ArrayList

            多线程并发访问的前提下
                Vector 线程安全 效率低
                ArrayList 线程不安全 效率高
            枚举 就是Vector特有的取出方式
            其实 枚举 和 迭代器 是一样的
            因为枚举的名称 以及 方法名 都太长了 所以就被迭代器取代了
    List集合特有的迭代器
        ListIterator
            hasNext()
            next() 
            注意 指针 先向后移动 再移动回来 单独写previous 获取不到数据 必须 先将指针向后移动 才能向前移动
            hasPrevious() 
            previous()   

2.Set
    Set和Collection接口的方法一致
    Set集合是最简单的一种集合

        无序(存储顺序 和 底层存储顺序不一致)
        不可重复
        无索引
    HashSet
        HashSset 集合 底层是哈希算法(哈希码表)
            存取速度比较快
            当程序向HashSet中存储数据时 调用add()方法
            先用hashCode()方法 计算出该对象的哈希码值
            然后用equals()方法 判断对象的值是否相同
                不相同 则存储
                相同 则不存
            如果元素的hashCode值相同 才会判断equals是否相同
            如果元素的hashCode值不同 不会调用equals方法
        LinkedHashSet
            是HashSet的子类 底层是双向链表
            特点:
                排重
                无索引
                有序(存储循序 和 底层存储顺序一致)
            没有特殊方法 该怎么用就怎么用
    TreeSet
        TreeSet 集合 底层是二叉树
            排重
            无序
            无索引
            排序(升序) 按照自然顺序排序 ASCII码表的顺序排序

            TreeSet集合 如何给自定义数据类型进行排序?

            第一种方式
                让自定义类 实现 public interface Comparable<T>接口
                此接口强行对实现它的每个类的对象进行整体排序。
                这种排序被称为类的自然排序,
                类的 compareTo 方法被称为它的自然比较方法。
                /*
                 * 返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象
                 * 此对象 小于 指定对象 返回 负整数
                 * 此对象 等于 指定对象 返回 0
                 * 此对象 大于 指定对象 返回正整数
                 * */
            第二种方式
                让容器具备比较性
                在创建TreeSet集合的同时 传入public interface Comparator<T>接口 
                重写 compare方法
                强行对某个对象 collection 进行整体排序 的比较函数。
                /*
                 * 参数:
                    o1 - 要比较的第一个对象。
                    o2 - 要比较的第二个对象。 
                    返回:
                    根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 
                        第一个参数 小于 第二个参数 返回 负整数
                        第一个参数 等于 第二个参数 返回 0
                        第一个参数 大于 第二个参数 返回 正整数  
                 * */
        总结:
            1.TreeSet集合是用来排序的 可以指定一个顺序 将对象存入之后 按照指定顺序进行排序
            2.使用方式区别
                1.自然排序(Comparable)
                    TreeSet集合的add()方法 会把存入的对象提升为 Comparable对象
                    调用compareTo()方法 和集合中的对象进行比较
                    根据compareTo()方法的返回值来进行存储
                2.比较器顺序(Comparator)
                    创建TreeSet集合的同时 指定一个Comparator比较器
                    如果传入了 Comparator比较器的子类对象
                    那么 TreeSet集合就会按照比较器中的顺序进行比较
                3.区别
                    TreeSet构造方法什么都不传 默认按照类中的Comparable的顺序排序
                    TreeSet构造方法如果传入Comparator 就会优先使用Comparator排序

猜你喜欢

转载自blog.csdn.net/weixin_42738506/article/details/81322192
今日推荐