Collection(接口)
    List(接口)
    ArrayList(实现类,线程不安全)
    Vector(线程安全,已淘汰)
    LinkedList(实现类)
    Set(接口)
    HashSet(实现类):底层通过HashMap实现 ,数组+哈希表
    LinkedHashSet:有序set
    TreeSet(实现类):唯一、有序;二叉树实现 ,需要实现内部比较器或者传入外部比较器;
    Map(接口)
    HashMap(实现类):元素必须重写hashCode 和equals
    LinkedHashMap:有序map,按照插入顺序排序
    HashTable:线程安全
    TreeMap(实现类):可以传入比较器

    什么是线程安全?
    当多个线程同时访问或修改线程共享资源的时候,由于线程内部可能进行的不是原子性操作,就可能导致无法预知的数据异常
    通常我们可以使用锁来对竞争资源进行保护,达到线程安全的目的。

    HashMap基本结构:数组+链表/红黑树
    initialcapacity(初始容量大小):默认16
    load_factor(扩容因子):当元素个数大于容量*扩容因子时,进行数组扩容,每次
    _TREEIFY_THRESHOLD=8:树化的临界值>=8

    UNTREEIFY_THRESHOLD=6:红黑树转链表的临界值
    MIN_TREEIFY_CAPACITY=64:树化的另一个条件数组容量>64

    如何避免哈希碰撞?
    在进行hash计算的时候,key做了一些位运算,使得key的高位与低位都有参与计算,从而使hash结果更为散列化

    hash表如何优化
    在进行put的时候,如果某hash值对应的桶位链表长度大于等于8时,会进行树化操作;当元素remove的时候,会判断红黑树的节点个数,如果小于6就转换成链表存储;同时,树化的时候还有一个点,会判断hash表的容量,如果小于64页不进行树化,只做扩容

    hashMap的线程安全问题?
    存在线程安全问题,同时get和put可能导致为get为null

    hashTable与hashMap的区别?
    HashTable是线程安全的,他给更新操作都添加了Synchronize,在多线程环境下,可以直接使用,但是效率较低,实际中不常用
    hashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。使用HashMap时就必须要自己增加同步处理
    concurrentHashMap是线程安全的,他采用的是分段锁,提高了并发时的效率。

    线程安全的LIst?
    vector。原理和ArrayList类似,给方法添加了synchronized,效率低
    CopyOnWriteArrayList。利用了写时复制的原理,达到了读共享,写互斥的效果,从而保证了线程安全,缺点是占用空间

    ArrayList构造:动态数组
    DEFAULT_CAPACITY:默认数组大小
    initialCapacity:初始化数组大小
    扩容:当前数组长度大于容量值的话进行扩容,0.5倍