第8章  Java集合 - 图1
    第8章  Java集合 - 图2
    Set 无序 不可重复 HashSet TreeSet
    Queue 队列 ArrayDeque
    List 有序 可重复 LinkedList ArrayListc
    Map HashMap TreeMap
    java5开始有了泛型
    java.util.Collections
    8.3 Set集合
    不重复元素的集合
    HashSet 不保证元素的顺序排列 线程不安全 集合值可以为Null
    HashSet判断两元素相等的标准:equals比较相等 且两个对象的hashCode()方法返回值也相等
    **当需要将某个类的对象保存到HashSet中,重写hashCode和equals方法时,尽量两方法一致,即hashCode值一致,equals也也返回一致True
    LinkedHashSet 将会保留元素的添加顺序
    TreeSet 采用红黑树的数据结构
    是Sorted接口的实现类,可以使集合元素保持有序
    向TreeSet中存入的对象,都必须实现了Comparable 方法,有compareTo方法
    如果希望TreeSet正常工作,TreeSet只能添加一种类型的对象
    8.4 List集合
    ArrayList和Vector是List类的典型实现
    都是基于数组实现的,内部都封装了一个动态的 允许再分配的Object[]数组
    只不过Vector是一个古老的集合(JDK1就有了),那时Java还没有集合框架
    Vector是线程安全的,但速度较慢;ArrayList是线程不安全的
    ArrayList(int initialCapacity)

    1. 构造一个具有指定初始容量的空列表。

    void ensureCapacity(int minCapacity)

    1. 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数

    Vector的直接子类:Stack 先入后出的数据结构
    Stack要尽量少用,需要用栈,可用ArrayDeque(实现了List和Deque)
    Arrays.asList() 将数组转换成一个List集合 这个List类是Arrays的内部实现类
    —>这个List集合里的元素只能被遍历 不能被增删
    与Collection.toArray() 顺序相反
    两者都是数组和集合之间的桥梁
    8.5 Queue集合
    offer 指定元素加入队列尾部
    peek 获取头部元素 但是不删除
    poll 获取头部元素 并删除
    Queue 队列
    Deque 双端队列(既可以当队列,也可以当栈)
    1、PriorityQueue实现类 优先队列 基于堆实现的
    会对队列中的元素进行排序,先poll出来的,都是小的元素(默认是一个最小堆)
    已经违反了队列最基本的规则:FIFO
    2、Deque接口和ArrayDeque实现类
    Deque接口有一个典型的实现类ArrayDeque
    双端队列,还可以当成是栈来使用
    当程序中需要用到栈这种数据结构时,推荐使用ArrayDeque
    ArrayDeque和ArrayList的实现机制基本相似
    java.util.Stack是一个古老的集合,性能较差
    3、LinkedList实现类
    所有已实现的接口:
    Serializable, Cloneable, Iterable, Collection, Deque, List, Queue
    是链表,是栈,也是队列
    值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用
    总结:
    总体来说ArrayList性能要比LinkedList要好,平时应该多考虑用ArrayList
    LinkedList 遍历时,因为是链表结构,最好用迭代器 Iterator
    ArrayList遍历时,因为是数组结构,用随机访问方法(get)比较好
    Queue使用时要尽量避免Collection的add()和remove()方法,
    而是要使用offer()来加入元素,使用poll()来获取并移出元素。
    它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。
    8.6 Java8增强的Map集合
    Map其实就是一种Set,只不过多了Value而已
    LinkedHashMap 使用一个双向链表来维护k-v的次序
    迭代次序与K-V对的插入顺序保持一致
    使用Properties读写属性文件
    Properties是HashTable的子类
    Properties是一个Key和Value 都是String的Map
    TreeMap 基于红黑树,每个K-V对都是红黑树的一个节点。
    TreeMap可以保证所有的K-V对都处于有序状态
    Set和Map的关系非常紧密,
    Java源码中先实现Map类,然后通过包装一个所有value值都是null的Map,实现了Set
    现在主要考虑的是如何保证数据安全性的同时,降低存储费用