LinkedList,ArrayList,HashMap,TreeMap,LinkedHashMap,HashSet之间区别

一.  集合相关技术,LinkedList,ArrayList,HashMap,TreeMap,LinkedHashMap,HashSet,之间的区别,以及各个集合的实现原理,以及更好的实现方式。

集合可以理解为一个容器,这种容器主要指映射(Map),集合(Set),列表(List),散列表(Hashtable)。

Collection接口有三个常用的子接口,Set(集合),List(列表),Queue(队列)。

Set:Conllection允许重复值,但是Set不允许重复值。

Map:存储Key-Value数据,Map中不允许有重复的Key,但是可以有重复的Value,跟Conlection没有任何关系。

List:存储元素有序,引入的位置索引,允许重复值。

先说List吧,API中说是有序的Conllection(序列)。List接口的常用实现类:LinkedList,ArrayList:

  ArrayList相当于一个对象数组,相对于数组来说,数组效率更高,因为数组是连续的存储数据,索引速度非常的快,数组的大小需要提前固定。ArrayList存储的是Object,相当于一个动态的Object[ ],在插入两种类型的数据时是不会报错的,但是在使用中,很可能会报类型不匹配的错误,所以ArrayList不是类型安全的,ArrayList因为存储的是Object所以就涉及到了装箱和拆箱的问题,所以在效率上相对数组来说变低了。但是jdk1.5加入了泛型的概念,让ArrayList在使用的时候更加安全了,同时ArrayList大小可以动态的增加比数组使用起来更加灵活。所以很多情况下使用,要根据具体的情况来定。

LinkedList:

  链接列表,相当于一个带链表的List,同时LinkedList不具有线程安全,要是想要让LinkedList具有线程安全用Collections.synchronizedList(new LinkedList()); ,它和ArrayList在本质上,ArrayList是基于数组的数据结构,而LinkedList是基于链表的数据结构。在源码中,LinkedList定义了一个双向的指针。每一个Node,都有一个前驱和后驱,java中没有指针,只有引用。

 

包装了在开头和结尾进行get,remove,insert的方法。所以相对于ArrayList,在实际应用中,如果对List的中间和开头插入或移除时,因为ArrayList需要在后面所有元素往后一位,需要复制和移动的开销,而LinkedList只需要改变两个连接,它在开头和中间插入一个数据的时间是固定的,LinkedList,性能会优于ArrayList。但是LinkedList不支持随机的访问,如果需要随机的访问,和只在最后插入数据,就是用ArrayList同时LinkedList还可以用作栈和队列或双端队列使用。

  Set中不允许重复值,但是HashSet很容易查询到里面的一个元素,HashSet专门为快速查找进行了优化。HashSet是继承了Set接口的,里面的元素是无序的,它就相当于是一个HashMap集合,键是存储的元素,所对应的值是系统映射的一个虚拟值,然后能够快速的查找到元素的位置。

  HashSet是无序的,要是想有序的话,使用TreeSet,LinkedHashMap

 

Map:

HashMap实现了Map接口,不具有线程安全,可以通过Collection的静态方法synchronizedMap获得线程安全的HashMap。

HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道,解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的。

 图中,紫色部分即代表哈希表,也称为哈希数组,数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。

HashMap是无序的,而LinkedHashMap和TreeMap是有序的。

TreeMap:

对Map的排序顺序采用的是黑红二叉树算法的原理进行排序,具体可以理解这篇文章。

http://blog.csdn.net/chenssy/article/details/26668941

LinkedHashMap:

它相当于是在HashMap中插入了一个双向链表,然后每次插入的数据按照插入的顺序来进行排序,它相当于定义了一个双向链表,来把所有的Entry串联起来。并不保存Key和Value。

你可能感兴趣的:(Java语言)