Collection接口:
collection是最基本的集合接口,一个Collection代表一组object,集Collection的元素,java不提供直接继承自Collection的类,指提供继承与的子接口(如list和set)collection接口存贮一组不唯一,无序的对象。
List接口:(有序、可重复)
(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素。
(2)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素。
(3)LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素。
Set接口:(无序、不能重复)
(1)HashSet:底层数据结构是哈希表,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
(2)LinkedHashSet:底层数据结构是哈希表和链表,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。
(3)TreeSet:底层数据结构式红黑树元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法。
Set和List的区别:
1.Set不允许重复的对象,List可以允许重复的对象。
2.Set指允许一个Null元素,可以插入多个Null元素
3.Set是一个无序容器,List是一个有序容器
HashSet和TreeSet的区别:
1.HashSet是用一个哈希表实现的,TreeSet是用红黑树实现的
2.HashSet的元素是无序的,TreeSet是有序的
3.HashSet的增删时间复杂度为O(1),TreeSet为O(logn)
Map接口:
map接口存储一组键值对象,提供key到value的映射,它们都可以使用任何引用类型的数据。key不能重复,所以通过指定的key就可以取出对应的value。(键值对,键唯一,值不唯一)
(1)HashMap:最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的
- JDK8 之前,HashMap 由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。
- JDK8 以后,在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8 )时,将链表转化为红黑树,以减少搜索时间。
(2)HashTable:它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。
(3)LInkedHashMap:LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。
(4)TreeMap:TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的;
HashMap和Hashtable的区别:
1.Hashtable是线性安全的,HashMap是线性不安全的,后者效率更高
2.Hashtable不允许使用null作为key和value,而HashMap可以
3.HashMap和HashTable底层都是哈希表
4.HashTable中数组默认大小是11,扩容方法是 old * 2 + 1
,HashMap默认大小是16,扩容每次为 2 的指数大小。