List、Set和Map都是接口(Interface),其中Collection是所有集合类的接口,Set和List也都实现该接口
LIst
List比较常用的有ArrayList和LinkedList,还有一个比较类似的Vector
ArrayList
ArrayList是线程不安全的,在不考虑线程安全的情况下查询速度比较快的。ArrayList插入数据可以重复,性能上要比Vector(是线程安全的)好一些,但是删除就比较慢,因为底层的数据结构是数组
Vector
基于数组(Array)的List,Vector其实是对数组的动态扩充,底层的数据结构使用的是数组结构(数组长度是可变的百分之百延长)。Vector是线程同步(sychronized)的,线程安全的。但是使用效率上就不如ArrayList了
LinkedList
LinkedList不同于前面两个,是基于链表实现的双向链表数据结构。
包括(
1、节点本身的数据(data)
2、前一个节点的信息(previousNode)
3、下一个节点的信息(nextNode)
)
因为是基于链表的数据结构,所以插入删除比较快,查询慢
Set
Set是一种不包含重复的元素的无序Collection。 一般使用的有HashSet和TreeSet。List的数据结构是链表和数组,但是set的数据结构是哈希表
HashSet
HashSet是根据hashCode来决定存储位置的,是通过HashMap实现的,所以对象必须实现hashCode()方法,存储的数据无序不能重复,可以存储null
LinkedHashSet
是HashSet的一个子类,格按照放入顺序排列,如果你想让取出元素的顺序和插入元素的顺序完全相同,那么就使用LinkedHashSet代替HashSet。
TreeSet
它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。TreeSet是根据二叉树实现的,也就是TreeMap,,放入数据不能重复且不能为null,可以重写comparator()方法来确定元素大小,从而进行升序排序
Map
Map 是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射
一个 Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的
Map有两种比较常用的实现:HashMap和TreeMap 还有一个hashtable
HashMap
HashMap的数据结构,在JDK8之前,是数组+链表。在JDK8后中,当长度大于8的时候,会自动变成数组+红黑树。, 原因是:
基于一个数组以及多个链表的实现,hash值冲突的时候,就将对应节点以链表的形式存储。
这样子的HashMap性能上就抱有一定疑问,如果说成百上千个节点在hash时发生碰撞,存储一个链表中,那么如果要查找其中一个节点,那就不可避免的花费O(N)的查找时间,这将是多么大的性能损失。这个问题终于在JDK8中得到了解决。再最坏的情况下,链表查找的时间复杂度为O(n),而红黑树一直是O(logn),这样会提高HashMap的效率
HashMap和Hashtable的区别
1.两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全
Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap
2.HashMap可以使用null作为key,而Hashtable则不允许null作为key
3.HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类
4.HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75
5.HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1
HashMap、LinkedMap、TreeMap的区别
(1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
(2)Hashtable
与HashMap
类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable
,然而,这也导致了Hashtable
在写入时会比较慢。
(3)LinkedHashMap
保存了记录的插入顺序,在用Iteraor
遍历LinkedHashMap
时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap
慢。有HashMap
的全部特性。
(4)TreeMap
能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor
遍历TreeMap
时,得到的记录是排过序的。TreeMap
的键和值都不能为空。
如何决定选用HashMap还是TreeMap
TreeMap
取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap
会更好。LinkedHashMap
是HashMap
的一个子类,如果需要输出的顺序和输入的相同,考虑此。