Java Collections中类的特色

Java Collections Framework

Arraylist

    数组结构。特色查询快,不适合对结构的前中部位,进行大量插入,删除操做,由于会形成数组元素大量迁移。线程不安全,若要线程安全建议用CopyOnWriteArrayList。数组

LinkedList

    双向链表结构。自己实现Deque接口,队列结构。适用于频繁改变集合结构。好比对结构全部部位的插入,删除等。因为双向链表结构特色,对于结构中间部位的操做,内部须要遍历较长距离,较为耗时。线程不安全,线程安全可用ConcurrentLinkedDeque。缓存

HashMap

    数组加链表的结构,key的对象必须实现equals与hashcode的函数,其中equals方法是为了防止产生hash冲突,若是多个key哈希一致,若是没有达到扩容的条件,先是组建链表,插入到key对应数组位置的链表尾部,在Java8中,若是链表过长,则会生成一颗红黑树。安全

    扩容中,会从新构建内部结构,这个过程是比较耗时的,因此合适的集合容量很重要。因为内部设计采用位操做来计算hash值对于的位置,实际上最大容量会是,好比16,32,64。函数

    线程不安全,线程安全建议用ConcurrentHashMap。spa

LinkedHashMap

         继承HashMap,保持插入顺序。AccessOrder为true时,被访问的元素放到最尾部,为false时保留原来的插入顺序。线程

         比HashMap多维护一个双向链表。遍历时直接使用此链表。非线程安全。设计

WeakHashMap

    弱引用,其中的Entry(继承WeakReference)只能存活到下一次垃圾回收前,通常用在缓存设计。code

TreeMap

    基于红黑树的实现,是有序结构,默认new对象时没有传入Comparator则按照Comparable接口提供的方法不然用传入的Comparator进行大小判断。非线程安全,若是要线程安全,其中一个方法是,用Collections. synchronizedSortedMap处理该对象,返回SortedMap。对象

HashSet

    内部使用了HashMap,只使用了Key,把key单作HashMap的key,其中使用预生成的Object对象当作全部key的value。注意key须要实现,hashcode与equals函数。继承

CopyOnWriteArrayList

    每次添加一个值时,开启锁,先新建一个数组B,而后复制缓存中的数组A到这个数组B,而后对这个新数组B进行添加操做,然后从新设置list的缓存数组为B,解锁。同时使得每次get,for操做都是对过去缓存A进行操做。修改操做与上相似,以此达到线程安全的目的。

    对于迭代次数远远大于修改次数时,应当用此类,相反时,因为每次修改将会生成新的数组来替换,因此应当用Collections.synchronizedList()生成的线程安全List。

 

线程安全的处理:

    在没有可用替代类的状况下,能够本身经过组合或则继承(建议组合,减小没必要要的非线程安全方法的暴露)的方式,构造线程安全的方法,或则经过Collections.synchronize*() 方法的生成新对象。因为synchronize*对方法的锁范围大,建议尽可能用替代类。