集合容器主要用于保存对象。集合容器主要分为以下四类形式保存:
一、List 有序、重复的集合。
二、Set 无序、不可重复。
三、Queue 保持一个队列(先进先出)的顺序。
四、Map 键值对存储。算法
一、Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,能够重复的元素。
二、Set检索效率低下,删除和插入效率高,插入和删除不会引发元素位置改变 ,实现类有HashSet,TreeSet。
三、List和数组相似,能够动态增加,根据实际存储的数据的长度自动增加List的长度。查找元素效率高,插入删除效率低,由于会引发其余元素位置改变 ,实现类有ArrayList,LinkedList,Vector,CopyOnWriteArrayList。数组
一、二者都是基于索引,内部结构是数组。
二、元素存取有序并都容许为null。
三、都支持fail-fast机制。
四、Vector是同步的,不会过载,而ArrayList不是,但ArrayList效率比Vector高,若是在迭代中对集合作修改可使用CopyOnWriteArrayList。
五、初始容量都为10,但ArrayList默认增加为原来的50%,而Vector默认增加为原来的一倍;ArrayList更通用,可使用Collections工具类获取同步列表和只读列表。安全
Vector是线程同步的,因此它也是线程安全的,而ArrayList是线程异步的,是不安全的。若是不考虑到线程的安全因素,通常用ArrayList效率比较高。
若是集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有必定的优点。数据结构
一、二者都是List接口的实现类。
二、ArrayList是基于动态数组的数据结构,而LinkedList是基于链表的数据结构。
三、对于随机访问get和set(查询操做),ArrayList要优于LinkedList,由于LinkedList要移动指针。
四、对于增删操做(add和remove),LinkedList优于ArrayList。多线程
当须要对数据进行对此访问的状况下选用ArrayList,当须要对数据进行屡次增长删除修改时采用LinkedList。
CopyOnWriteArrayList
一、CopyOnWriteArrayList是ArrayList的线程安全的变体,其中的全部可变操做(add, set等)都是对底层数组进行一次新的复制来实现的,相比ArrayList的要慢一些,适用于读多写少的场景。
二、在并发操做容器对象时不会抛出ConcurrentModificationException,而且返回的元素与迭代器建立时的元素是一致的。
三、容器对象的复制须要必定的开销,若是对象占用内存过大,可能形成频繁的YoungGC和Full GC 。
四、CopyOnWriteArrayList不能保证数据实时一致性,只能保证最终一致性。架构
一、都是基于hash表实现的,每一个元素都是key-value对,内部都是经过单向链表解决冲突,容量都会自动增加HashMap默认容量为16,每次扩容变为原来的2倍,HashTable初始容量为11,每次扩容变为原来的2倍加1。
二、HashMap继承自AbstractMap类,HashTable继承自Dictionary类。
三、HashTable是同步的,适合多线程环境,而HashMap不是,但效率相对较高。
四、HashMap容许key和value为null,而HashTable不容许。
五、Hash值的使用不一样,HashTable直接使用对象的hashcode值,而HashMap从新计算hash值。
六、在Java1.4中引入了HashMap的子类LinkedHashMap,若须要遍历顺序,能够从HashMap转向LinkedHashMap, 而HashTable的顺序是不可预知的。
七、HashMap提供对key的Set进行遍历,所以它支持fail-fast机制,而HashTable提供对key的Enumeration进行遍历,不支持fail-fast。
八、HashTable被认为是个遗留的类,若是在迭代的时候修改Map,可使用ConcurrentHashMap(Java5出现)
九、HashTable产生于JDK1.1,而HashMap产生于JDK1.2。并发
一、HashSet不能保证元素的排列顺序,TreeSet是SortedSet接口的惟一实现类,能够确保集合元素处于排序状态
二、HashSet底层用的是哈希表,TreeSet采用的数据结构是红黑树
三、HashSet中元素能够是null,但只能有一个,TreeSet不容许放入null异步
HashSet是基于Hash算法实现的,其性能一般都优于TreeSet。咱们一般都应该使用HashSet,在咱们须要排序的功能时,咱们才使用TreeSet。工具
一、HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。
二、ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分红了几个小的片断segment,并且每一个小的片断segment上面都有锁存在,那么在插入元素的时候就须要先找到应该插入到哪个片断segment,而后再在这个片断上面进行插入,并且这里还须要获取segment锁。
三、ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。性能
一、Enumeration是JDK1.0出现的,只能读取集合的数据。
Iterator是JDK1.2出现的,用来替代Enumeration,增长了remove()方法,能够在迭代过程当中移除元素 。
二、Iterator的方法名是标准化的 。
三、Iterator支持fail-fast机制,而Enumeration不支持 。
四、Enumeration的内存占用较少,效率比Iterator高,但Iterator更安全。
一、ListIterator继承自Iterator接口,而后添加了一些额外的功能 。
二、二者都有hasNext()和next()方法,能够实现顺序向后遍历,ListIterator还有hasPrevious()和previous()方法,能够实现逆序遍历 。
三、都有remove()方法能够实现删除对象,ListIterator还有添加方法add()和修改方法set(),能够实现添加和修改对象,Iterator的协议不能确保迭代的次序,因此没有提供add()方法 。
四、Iterator能够遍历Set和List集合,而ListIterator只能遍历List集合 。
五、ListIterator有nextIndex()和previousIndex()方法,能够定位当前的索引位置,Iterator没有此功能。
若是内容对你有帮助但愿点赞收藏谢谢!!!