@refenrence:http://blog.sina.com.cn/s/blog_4b5159b7010009r0.html
@refenrence:http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857791.html
1.ArrayList: 元素单个,效率高,多用于查询
2.Vector: 元素单个,线程安全,多用于查询
3.LinkedList:元素单个,多用于插入和删除
4.HashMap: 元素成对,元素可为空
5.HashTable: 元素成对,线程安全,元素不可为空
一、Vector、ArrayList、LinkedList三者间的区别。
java.util
接口 List<E>所有超级接口:
- Collection<E>, Iterable<E>
- ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。底层是Object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。
- Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。Vector是重量级的组件,使用使消耗的资源比较多。在考虑并发的情况下用Vector(保证线程的安全)。在不考虑并发的情况下用ArrayList(不能保证线程的安全)。
- LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。队列:先进先出的数据结构。栈:后进先出的数据结构。注意:使用栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。
- hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。虽然hashSet查询和删除和增加元素的效率都非常高,但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。使用hashSet类时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。
二、Vector Demo。
package com.key.demo.queue; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorTest { public static void main(String[] args) { Vector values1 = new Vector(); System.out.println("values1.size():" + values1.size()); // 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。 Vector values2 = new Vector(10); System.out.println("values2.size():" + values2.size()); // 增量为5 Vector values3 = new Vector(10, 5); System.out.println("values3.size():" + values3.size()); System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); // ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 /** * 演示Vector的使用。包括Vector的创建、向Vector中添加元素、从Vector中删除元素、 * 统计Vector中元素的个数和遍历Vector中的元素。 */ // Vector的创建 // 使用Vector的构造方法进行创建 Vector v = new Vector(4); // 向Vector中添加元素 // 使用add方法直接添加元素 v.add("Test0"); v.add("Test1"); v.add("Test0"); v.add("Test2"); v.add("Test2"); // 从Vector中删除元素 v.remove("Test0"); // 删除指定内容的元素 v.remove(0); // 按照索引号删除元素 // 获得Vector中已有元素的个数 System.out.println("size:" + v.size()); // 遍历Vector中的元素 for (int i = 0; i < v.size(); i++) { System.out.println(v.get(i)); } System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Vector v1 = new Vector(); v1.addElement("one"); v1.addElement("two"); v1.addElement("three"); v1.insertElementAt("zero", 0); v1.insertElementAt("oop", 3); v1.setElementAt("three", 3); v1.setElementAt("four", 4); System.out.println("size:" + v1.size()); for (int i = 0; i < v1.size(); i++) { System.out.println(v1.get(i)); } v1.removeAllElements(); System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Vector v2 = new Vector(); v2.addElement("one"); v2.addElement("two"); v2.addElement("three"); Enumeration en = v2.elements(); while (en.hasMoreElements()) { System.out.println(en.nextElement()); } // 由 Vector 的 iterator 和 listIterator 方法所返回的迭代器是快速失败的: // 如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的 remove 或 add 方法之外的任何其他方式), // 则迭代器将抛出 ConcurrentModificationException。 // 因此,面对并发的修改,迭代器很快就完全失败,而不是冒着在将来不确定的时间任意发生不确定行为的风险。 // Vector 的 elements 方法返回的 Enumeration 不是 快速失败的。 // 见其他随笔解释 System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); v2.listIterator(); Iterator it = v2.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }