上次面试的时候被问到了关于List、Set和Map的一些知识,回答的不是很好,今天特意查询了一天关于这方面的一些知识,在此整理一下,自己熟悉知识的同时也做个记录。
List:
List是一个继承于Collection接口,拥有所有的Collection的方法,用于存放线性表数据,对线性表的大小没有限制要求,只要数据在所属数据类型的范围内都可以存放在List中。List接口的两个实现类是ArrayList和LinkedList。
ArrayList: ArrayList是List的顺序存储方式,类似于数组,方便查询,但是对于元素的删除和插入不是很方便。当然ArrayList提供了add(int i, Element e) 和remove(i)方法分别实现插入元素和删除元素,但是时间复杂度是线性的。
LinkedList: LinkedList是List的链表存储方式,方便元素的删除运算和插入运算,但是对于元素的查询,也是需要线性的时间复杂度。这里LinkedList也提供了getFirst(), getLast(), get(index)方法进行查询,方便调用。
ArrayList和LinkedList都允许null元素的插入。
Set:
Set也是一个继承于Collection的接口,也拥有Collection的所有方法。Set中存放的元素要求是无重复的(No Duplicated),Set的实现类为HashSet,TreeSet和LinkedHashSet。
HashSet: 是利用HashTable实现存储的Set的一种存储方式,HashSet中至多只能有一个null值,存取速度较快,存取操作时间均为O(1),无序;
TreeSet: 是利用红黑树实现的一种Set的存储方式,有序,存取操作时间复杂度为O(log(n));
LinkedHashSet: 是利用HashTable实现链式存储的存储方式,按照插入的顺序放置,基本操作时间复杂度为O(1)。
参考Link: http://java.dzone.com/articles/hashset-vs-treeset-vs
Map:
Map是一个存储键值对(key, value)映射的接口,key值是用来检索value值的对象。它的实现有HashMap和TreeMap。
HashMap: HashMap也是利用HashTable存储键值对的,可以存储null键和null值,当hashcode相同时,key值相同的会被覆盖掉,查找速度较快。
TreeMap: TreeMap是利用二叉搜索树进行存储的,所以得到的数据都是有序的,但是检索时间较HashMap长。
List vs Set:
由上面的分析可以看到:List和Set的主要区别在于,Set是无重复元素的Collection,而List是有重复元素的。当然,具体到不同的实现又会有不同的地方,但是根本上的不同就是有无重复元素。
ArrayList vs Vector:
相同点:
1. ArrayList和Vector都是根据数组进行存储的;
2. ArrayList和Vector会保留数据插入时的顺序;
3. ArrayList和Vector都可以存储null值,并且都可以有重复元素。
不同点:
1. Vector是Synchronized的,所以更改和删除Vector是线程安全的,而ArrayList不是Synchronized的,所以Vector更适合用于多线程,这点是主要的区别;
2. ArrayList的存取速度比Vector更快,正是由于Vector是线程安全的,所以Vector在速度上不如ArrayList快。
3. 容量的增长,没有指定增量的ArrayList和Vector的容量的增速是不一样的。所以,当容量小于数据长度时,ArrayList是以1.5倍的速度增长,而Vector是以2倍的速度增长。