List, Set, Vector and Map in Java

来源:互联网 发布:淘宝众筹失败会怎么样 编辑:程序博客网 时间:2024/06/06 17:41

上次面试的时候被问到了关于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倍的速度增长。

0 0
原创粉丝点击