疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

List、Set和Map大讨论


 

   

  从Collection开始吧,Collection是一个接口,它包含List和Set两个子接口(Quene这里不讨论了),我们今天主要讨论一下:List、Set和Map。

  List是实现了Collection接口的接口,实现类:LinkedList、ArrayList、Vector

  Set是实现了Collection接口的接口,实现类:HashSet、TreeSet、LinkedSet

  Map是接口,实现类:HashMap、Hashtable、TreeMap、LinkedHashMap、WeakHashMap、IdentityHashMap

  Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。

  List、Set和Map接口的不同:

  List存放的是单个元素,元素是可重复的,可以存放Null元素。

  Set存放的是单个元素,元素不可重复

  Map存放的是键值对,key是不可重复的,value是可重复的;键值都可以是Null,但是key只能有一个Null。

  下面说说这个三个接口的常用实现类:

  List:

  Vector:

  基于数组(Array)的List,是线程同步的(sychronized)的

  ArrayList:

  同Vector一样是一个基于数组上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。

  LinkedList:

  LinkedList不同于前面两种List,它不是基于数组的,所以不受数组性能的限制。它每一个节点(Node)都包含两方面的内容:

  1.节点本身的数据(data);

  2.下一个节点的信息(nextNode)。

  所以当对LinkedList做添加、删除动作的时候就不用像基于数组的ArrayList一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了,这是LinkedList的优势。

  Set:

  HashSet:

  虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。

  HashSet的存储方式是把HashMap中的Key作为Set的对应存储项,这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。

  LinkedHashSet:

  HashSet的一个子类,一个链表。

  TreeSet:

  不同于HashSet的根本就是TreeSet是有序的,它是通过SortedMap来实现的。

  Map:

  HashMap

  用到了哈希码的算法,以便快速查找一个键和它对应的值。

  TreeMap

  是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。

  当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。

  至此,我们给出了常用集合类的优缺点,有的时候,就是这些小小的知识点就把你系统的性能打了很大的折扣。我们在使用上稍稍注意,对系统就是一次拯救!