List,Set,Collections工具类

# List、Set

    1. 数据结构
        * 栈结构:先进后出
        * 队列结构:先进先出
        * 数组结构:是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。
            * 数组特点:查询快,增删慢。且数组的长度在内存中是固定的,不可改变。存储位置连续
            * 指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。
            * 指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。
        * 链表结构:由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。常说的链表分为单项链表和双向链表,单项链表每个结点只能指向下一个结点,而双向链表可以指向前一个和下一个结点。
            * 链表特点:
                * 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
                * 增删元素快:
                    增加元素:只需要修改连接下个元素的地址即可。
                    删除元素:只需要修改连接下个元素的地址即可。
                * 长度不固定,存储位置不一定连续

    2. List
        1. 特点
            有序(存进去和取出来的顺序一致)
            有索引,方便查询,但是增删元素较慢
            可以存储重复元素
        2. 特有方法(能够使用索引的方法)
            * void add(int index,E e):给指定的位置添加元素
            * E remove(int index):删除指定位置元素,并返回bool类型的删除结果
            * E set(int index,E e):修改指定位置的元素为e,并返回被修改的原数据。
            * E get(int index):获取指定位置元素
        3. ArrayList<T>
            * 使用数组结构,查询快,增删慢
        4. LinckedList<T>
            * 底层是链表结构,查询慢,增删快
            * 可以进行首位操作,所以Lincked有6个特有方法:
                * addFirst()  addLast()
                * removeFirst()  removeLast()
                * getFirst()  getLast()
        5. Vector
            * 底层也是数组结构
            * Vector与ArrayList的区别:
                * 相同点:
                    底层都是数组结构,特点就是查询块,增删慢
                  不同点:
                    Vector是线程安全的,效率低
                    ArrayList线程不安全的,效率高

    3. Set
        1. HashSet(无序,不可重复,无索引)
            * LinkedHashSet:有序
            * 如何保证Set集合内元素唯一呢?
                * 依赖两个方法hashCode方法,equals方法
                    先执行hashCode方法,会和集合中的每一个元素的hash值进行比较,如果不同,直接添加
                        如果相同,执行equals方法判断,如果相同,就不添加,如果不同就添加元素

        2. 集合使用的选择:
            允许存储重复元素:
                是:使用List集合
                    查询多还是增删多
                        查询多:选择ArrayList
                        增删多:选择LinkedList
                        
                    不知道是查询多还是增删多,就使用ArrayList
                        
                        
                否:使用set集合
                    有序吗?
                        是:选择LinkedHashSet
                        否:选择HashSet
                        
                    不知道是否有序使用HashSet
                    
              什么都不知道选择ArrayList

              适当的情况选择适合的容器可以增加我们的代码效率

    4. 可变参数
        定义:
            修饰符 返回值类型 方法名(数据类型... 参数名) {
                在方法中使用参数参数就可以看做是数组
            }
            
        使用:
            方法名(参数) // 参数可以是0个,也可以是多个
    5. Collections工具类
        * 特点:
                构造方法私有
                成员静态
        
        *方法:
            sort(List list):按照自然排序
            sort(List list, Compartor c): 按照比较器进行排序

            自然排序就是按照默认规则由小到大排序(集合内容是可比较的类型)

            比较器排序: 集合中存储的元素的类型实现了Comparable(可比较的)接口
        
            ArrayList<String> list = new ArrayList<>();
            Collections.sort(list, new Compartor() {
            
                重写方法
            });

posted @ 2018-08-07 21:18  前进小白  阅读(291)  评论(0编辑  收藏  举报