cccreator / Java

Accumulation And Mark
0 stars 0 forks source link

Java Collection #8

Open cccreator opened 6 years ago

cccreator commented 6 years ago

Collection

20160922090459259 Collection<E> 接口是所有单列集合的共同父接口,下面是常用的子类集合及其继承关系;

Collection包括List和Set; 其中,

  1. ArrayList是线程不安全的,底层使用数组实现,具有查询快,增删慢,效率高的特点,效率高;对于随机访问get和set,ArrayList优于LinkedList,因为LinkList要移动指针。

  2. LinkedList是线程不安全的,底层是用链表实现的,具有查询慢,增删快的特点,效率高;对于新增和删除操作add和remove,LinkList要优于ArrayList,因为ArrayList要移动数据:当arrayList插入或者删除数据时,后面的数据会移动。

  3. Vector是线程安全的,底层使用数组实现,具有查询快,增删慢的特点,效率低;

  1. HashSet的底层是由HashMap来实现的,是通过对象的HashCode方法与equal方法来保证插入数据的唯一性;

  2. TreeSet基于TreeMap的NavigableSet实现;

cccreator commented 5 years ago

Map

  1. HashMap,非同步的,只允许一条记录的key值为空;HashMap是线程不安全的,为什么呢?这是由于hash碰撞与扩容导致的:比如当两个线程同时对HashMap进行put操作,key值为a1和a2,这个时候需要解决碰撞冲突,如果这个时候两个线程同时取到了对应位置头结点e1,则a1和a2必有一个丢失。当两个线程同时进行put操作时,HashMap存在扩容情况,同时调用resize()方法,各自生成新的数组并rehash后付给该map的底层数组table,结果最终只有一个线程生成的新的数组被赋给table变量。

  2. TreeMap,能够把它保存的记录根据key排序,默认升序,也可以指定排序的指定容器,当用Iterator遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key为null。是非同步的

  3. Hashtable,与HashMap类似,不同点:key和value不允许为null;它支持线程的同步,即任一时刻只允许一个线程能写Hashtable,因此Hashtable在写入的时候比较慢。

  4. 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。

cccreator commented 5 years ago

缓存

使用ConcurrentHashMap