黑马程序员---Vector、ArrayList、LinkedList、HashMap、TreeMap、HashTable 区别

------- android培训java培训期待与您交流! ---------- 

    Java中最常用的集合是Collection和Map两个接口的实现类,Collection用于存放多个单对象,Map用于存放Key-Value形式的键值对。

    Collection又分为两种类型的接口:List和Set,其中List支持放入重复的对象,而Set不支持。

     List接口常用的实现类有:ArrayList,LinkedList,Vector;Set接口常用的实现有HashSet,TreeSet。

     Map接口的常用实现有:TreeMap和HashMap。

1、ArrayList

    1) ArrayList基于数组方式实现,无容量的限制。

    2) ArrayList在执行插入元素时可能要扩容,在删除数组时并不会减少数组的容量,但是需要移动好多元素,所以查询快,增删慢。

    3)ArrayList是非线程安全的。

2、LinkedList

   1)LinkedList基于双向链表机制实现。

   2) LinkedList在插入元素时,必须创建一个新的Entry对象,并切换相应元素的前后元素的引用;在查找元素时,须遍历列表;在删除元素时,要遍历列表,找到要删除的元素,然后从列表上将此元素删除即可。

   3) LinkedList是非线程安全的。

3、总结

从LinkedList和ArrayList的区别来看,选用ArrayList还是LinkedList,有以下两点需要考虑:

        1)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。 
            2)  对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

三、Vector

      和ArrayList的不同点有

      1) Vector是基于Synchronized实现的线程安全的ArrayList。即Vector是线程安全的。

      2)在插入元素时容量扩充的机制和ArrayList稍微有所不同,Vector是扩充2倍,并 可通过传入capacityIncrement来控制容量的扩充。 而ArrayList是扩充1.5倍并加1。

四、HashSet

      1. HashSet基于HashMap实现,无容量限制。

      2. HashSet是非线程安全的。 

      3. HashSet不保证有序。

五、TreeSet

      1、TreeSet基于TreeMap实现,支持排序。

      2、TreeSet是非线程安全的。

从对HashSet和TreeSet的描述来看,TreeSet和HashSet一样,也是完全基于Map来实现的,并且都不支持get(int)来获取指定位置的元素,另外TreeSet还提供了一些排序方面的支持。例如传入Comparator实现、descendingSet以及descendingIterator等。 

六、HashMap

       1、HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。

       2、HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。

       3、HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中。

       4、HashMap是非线程安全的。

       5、HashMap遍历使用的是Iterator

七、HashTable

      1、HashTable是线程安全的。

      2、HashTable中无论是Key,还是Value都不允许为null。

      3.   HashTable遍历使用的是Enumeration。

曾经HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable,可以使用ConcurrentHashMap。那么几者之间有什么区别呢?

      1、HashTable的内部存储结构

HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:

     1)、HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。

     2)、HashTable不允许有null值的存在。

在HashTable中调用put方法时,如果key为null,直接抛出NullPointerException。其它细微的差别还有,比如初始化Entry数组的大小等等,但基本思想和HashMap一样。

       1、TreeMap是一个典型的基于红黑树的Map实现,因此它要求一定要有Key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。

       2、TreeMap是非线程安全的。

你可能感兴趣的:(黑马程序员---Vector、ArrayList、LinkedList、HashMap、TreeMap、HashTable 区别)