JAVA常见的集合类知识

集合框架

最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。  

集合框架的部分优点如下:

(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。

(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。

(3)通过使用JDK附带的集合类,可以降低代码维护成本。

(4)复用性和可操作性。

结构图

          Collection(接口)

                              |
      ----------------------------------------------------------------------
      |                                                                                                      |
    List  (接口,可相同元素,有序)                                           Set(接口,不可相同元素)
-------------------------------------                                             ---------------------------------------
|                                                     |                                             |                                                        |
ArrayList(无同步,可null)   LinkedList(无同步,可null)      HashSet                                        TreeSet
 
Map(接口)
 |
--------------------------
|                                     |
HashMap               Hashtable
 
★Vector:同步的。Vector非常类似ArrayList。
★HashMap:非同步的,并且允许null,即null value和null key。但是将HashMap视为Collection时(values()方法可返回Collection),其迭代器操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
★hashtable:是同步的,任何非空(non-null)的对象都可作为key或者value。添加数据使用put(key, value),取出数据使用    get(key),这两个基本操作的时间开销为常数。Hashtable通过initial capacity和load factor两个参数调整性能。
 ★LinkedList:没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(...));  

总结

  • 如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
  • 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
  • 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
  • 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
注:线程安全与否,看是否同步。若同步,线程安全;否则线程非安全。
 
 
ArrayList和LinkedList的大致区别: 
     1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
     2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
     3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList和LinkedList的大致优缺点: 
      1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
       2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
       3.LinkedList不支持高效的随机元素访问。
       4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
 
List接口的常用实现子类---Vector
 Vector算是一个元老级的类,在JDK1.0的时候就已经存在此类了。但在1.2版本后,应用的更多的是新接口(如List),为了能将Vector的功能保留下来,才会有了List新的子类(如ArrayList)。
 
 
 
 
posted @ 2015-07-22 19:57  LiuZhenYou  阅读(308)  评论(0编辑  收藏  举报