ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都容许直接序号索引元素,然则插入数据要设计到数组元素移动等内存操纵,所以索引数据快插入数据慢,Vector因为应用了synchronized办法(线程安然)所以机能上比ArrayList要差,LinkedList应用双向链表实现存储,按序号索引数据须要进行向前或向后遍历,然则插入数据时只须要记录本项的前后项即可,所以插入数度较快!

线性表,链表,哈希表是常用的数据布局,在进行Java开辟时,JDK已经为我们供给了一系列响应的类来实现根蒂根基的数据布局。这些类均在java.util包中。本文试图经由过程简单的描述,向读者论说各个类的感化以及如何正确应用这些类。

Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap

Collection接口
  Collection是最根蒂根基的凑集接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection容许雷同的元素而另一些不可。一些能排序而另一些不可。Java SDK不供给直接持续自Collection的类,Java SDK供给的类都是持续自Collection的“子接口”如List和Set。
  所有实现Collection接口的类都必须供给两个标准的机关函数:无参数的机关函数用于创建一个空的Collection,有一个Collection参数的机关函数用于创建一个新的Collection,这个新的Collection与传入的Collection有雷同的元素。后一个机关函数容许用户复制一个Collection。
  如何遍历Collection中的每一个元素?非论Collection的实际类型如何,它都支撑一个iterator()的办法,该办法返回一个迭代子,应用该迭代子即可一一接见Collection中每一个元素。典范的用法如下:
    Iterator it = collection.iterator(); // 获得一个迭代子
    while(it.hasNext()) {
      Object obj = it.next(); // 获得下一个元素
    }
  由Collection接口派生的两个接口是List和Set。

List接口
  List是有序的Collection,应用此接口可以或许正确的把握每个元素插入的地位。用户可以或许应用索引(元素在List中的地位,类似于数组下标)来接见List中的元素,这类似于Java的数组。
和下面要提到的Set不合,List容许有雷同的元素。
  除了具有Collection接口必备的iterator()办法外,List还供给一个listIterator()办法,返回一个ListIterator接口,和标准的Iterator接口比拟,ListIterator多了一些add()之类的办法,容许添加,删除,设定元素,还能向前或向后遍历。
  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

LinkedList类
  LinkedList实现了List接口,容许null元素。此外LinkedList供给额外的get,remove,办法在LinkedList的首部或尾部。这些操纵使LinkedList可被用作客栈(stack),队列(queue)或双向队列(deque)。
  重视LinkedList没有同步办法。若是多个线程同时接见一个List,则必须本身实现接见同步。一种解决办法是在创建List机会关一个同步的List:
    List list = Collections.synchronizedList(new LinkedList(...));

ArrayList类
  ArrayList实现了可变大小的数组。它容许所有元素,包含null。ArrayList没有同步。
size,isEmpty,get,set办法运行时候为常数。然则add办法开销为分摊的常数,添加n个元素须要O(n)的时候。其他的办法运行时候为线性。
  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可跟着络续添加新元素而主动增长,然则增长算法并没有定义。当须要插入多量元素时,在插入前可以调用ensureCapacity办法来增长ArrayList的容量以进步插入效力。
  和LinkedList一样,ArrayList也长短同步的(unsynchronized)。

Vector类
  Vector很是类似ArrayList,然则Vector是同步的。由Vector创建的Iterator,固然和ArrayList创建的Iterator是同一接口,然则,因为Vector是同步的,当一个Iterator被创建并且正在被应用,另一个线程改变了Vector的状况(例如,添加或删除了一些元素),这时调用Iterator的办法时将抛出ConcurrentModificationException,是以必须捕获该异常。

Stack 类
  Stack持续自Vector,实现一个掉队先出的客栈。Stack供给5个额外的办法使得Vector得以被算作客栈应用。根蒂根基的push和pop办法,还有peek办法获得栈顶的元素,empty办法测试客栈是否为空,search办法检测一个元素在客栈中的地位。Stack刚创建后是空栈。

Set接口
  Set是一种不包含反复的元素的Collection,即随便率性的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
  很明显,Set的机关函数有一个束缚前提,传入的Collection参数不克不及包含反复的元素。
  请重视:必须警惕操纵可变对象(Mutable Object)。若是一个Set中的可变元素改变了自身状况导致Object.equals(Object)=true将导致一些题目。

Map接口
  请重视,Map没有持续Collection接口,Map供给key到value的映射。一个Map中不克不及包含雷同的key,每个key只能映射一个value。Map接口供给3种凑集的视图,Map的内容可以被算作一组key凑集,一组value凑集,或者一组key-value映射。

Hashtable类
  Hashtable持续Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
  添加数据应用put(key, value),取出数据应用get(key),这两个根蒂根基操纵的时候开销为常数。
Hashtable经由过程initial capacity和load factor两个参数调剂机能。凡是缺省的load factor 0.75较好地实现了时候和空间的均衡。增大load factor可以节俭空间但响应的查找时候将增大,这会影响像get和put如许的操纵。
应用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:
    Hashtable numbers = new Hashtable();
    numbers.put(“one”, new Integer(1));
    numbers.put(“two”, new Integer(2));
    numbers.put(“three”, new Integer(3));
  要取出一个数,比如2,用响应的key:
    Integer n = (Integer)numbers.get(“two”);
    System.out.println(“two = ” + n);
  因为作为key的对象将经由过程策画其散列函数来断定与之对应的value的地位,是以任何作为key的对象都必须实现hashCode和equals办法。hashCode和equals办法持续自根类Object,若是你用自定义的类算作key的话,要相当警惕,遵守散列函数的定义,若是两个对象雷同,即obj1.equals(obj2)=true,则它们的hashCode必须雷同,但若是两个对象不合,则它们的hashCode不必然不合,若是两个不合对象的hashCode雷同,这种现象称为冲突,冲突会导致操纵哈希表的时候开销增大,所以尽量定义好的hashCode()办法,能加快哈希表的操纵。
  若是雷同的对象有不合的hashCode,对哈希表的操纵会呈现意想不到的成果(等待的get办法返回null),要避免这种题目,只须要紧记一条:要同时复写equals办法和hashCode办法,而不要只写此中一个。
  Hashtable是同步的。

HashMap类
  HashMap和Hashtable类似,不合之处在于HashMap长短同步的,并且容许null,即null value和null key。,然则将HashMap视为Collection时(values()办法可返回Collection),其迭代子操纵时候开销和HashMap的容量成比例。是以,若是迭代操纵的机能相当首要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

WeakHashMap类
  WeakHashMap是一种改进的HashMap,它对key实验“弱引用”,若是一个key不再被外部所引用,那么该key可以被GC收受接管。

总结
  若是涉及到客栈,队列等操纵,应当推敲用List,对于须要快速插入,删除元素,应当应用LinkedList,若是须要快速随机接见元素,应当应用ArrayList。
  若是法度在单线程景象中,或者接见仅仅在一个线程中进行,推敲非同步的类,其效力较高,若是多个线程可能同时操纵一个类,应当应用同步的类。
  要希罕重视对哈希表的操纵,作为key的对象要正确复写equals和hashCode办法。
  尽量返回接口而非实际的类型,如返回List而非ArrayList,如许若是今后须要将ArrayList换成LinkedList时,客户端代码不消改变。这就是针对抽象编程。

同步性
Vector是同步的。这个类中的一些办法包管了Vector中的对象是线程安然的。而ArrayList则是异步的,是以ArrayList中的对象并不是线程安然的。因为同步的请求会影响履行的效力,所以若是你不须要线程安然的凑集那么应用ArrayList是一个很好的选择,如许可以避免因为同步带来的不须要的机能开销。
数据增长
从内部实现机制来讲ArrayList和Vector都是应用数组(Array)来把握凑集中的对象。当你向这两种类型中增长元素的时辰,若是元素的数量超出了内部数组今朝的长度它们都须要扩大内部数组的长度,Vector缺省景象下主动增长本来一倍的数组长度,ArrayList是本来的50%,所以最后你获得的这个凑集所占的空间老是比你实际须要的要大。所以若是你要在凑集中保存多量的数据那么应用Vector有一些上风,因为你可以经由过程设置凑集的初始化大小来避免不须要的资料开销。
应用模式
在ArrayList和Vector中,从一个指定的地位(经由过程索引)查找数据或是在凑集的末尾增长、移除一个元素所花费的时候是一样的,这个时候我们用O(1)默示。然则,若是在凑集的其他地位增长或移除元素那么花费的时候会呈线形增长:O(n-i),此中n代表凑集中元素的个数,i代表元素增长或移除元素的索引地位。为什么会如许呢?认为在进行上述操纵的时辰凑集中第i和第i个元素之后的所有元素都要履行位移的操纵。这一切意味着什么呢?
这意味着,你只是查找特定地位的元素或只在凑集的末尾增长、移除元素,那么应用Vector或ArrayList都可以。若是是其他操纵,你最好选择其他的凑集操纵类。比如,LinkList凑集类在增长或移除凑集中任何地位的元素所花费的时候都是一样的?O(1),但它在索引一个元素的应用缺斗劲慢-O(i),此中i是索引的地位.应用ArrayList也很轻易,因为你可以简单的应用索引来庖代创建iterator对象的操纵。LinkList也会为每个插入的元素创建对象,所有你要熟悉打听它也会带来额外的开销。
最后,在《Practical Java》一书中Peter Haggar建议应用一个简单的数组(Array)来庖代Vector或ArrayList。尤其是对于履行效力请求高的法度更应如此。因为应用数组(Array)避免了同步、额外的办法调用和不须要的从头分派空间的操纵。

文章摘自:

http://edu.21cn.com/linux/g_188_650560-1.htm

http://blog.csdn.net/sunboy_2050/article/details/7667364

Java ArrayList Vector LinkedList Stack Hashtable等的差别与用法(转)的更多相关文章

  1. Java中ArrayList,Vector,LinkedList,HashMap,HashTable,HashSet对比及总结

    1.所有的集合的父类都是Collection的接口 2.Set List Map 区别 A  在Set里面:无法添加元素的顺序,所以Set里面的元素不能重复 B  在List中:有索引号,类似于数组, ...

  2. Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理

    本文非常详尽地介绍了Java中的三个集合类 ArrayList,Vector与Stack <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整 ...

  3. Java基础系列 - JAVA集合ArrayList,Vector,HashMap,HashTable等使用

    package com.test4; import java.util.*; /** * JAVA集合ArrayList,Vector,HashMap,HashTable等使用 */ public c ...

  4. ArrayList Vector LinkedList 区别与用法

    转载自: http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html 最近用到了,所以依然是转载 ArrayList 和Vector是采用数组 ...

  5. Arraylist Vector Linkedlist区别和用法 (转)

    ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...

  6. ArrayList Vector LinkedList(一)

    ArrayList Vector LinkedList 区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素, ...

  7. 【转】ARRAYLIST VECTOR LINKEDLIST 区别与用法

    转自:http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实 ...

  8. paip.提升性能---list,arraylist,vector,linkedlist,map的选用..

    paip.提升性能---list,arraylist,vector,linkedlist,map的选用.. arraylist,vector基本一样,但是,vector线程安全的. 作者Attilax ...

  9. 请说出ArrayList,Vector, LinkedList的存储性能和特性

    请说出ArrayList,Vector, LinkedList的存储性能和特性 解答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都 ...

随机推荐

  1. linux mint系统 cinnamon桌面 发大镜功能

    让我来告诉迷途中的你cinnamon桌面一个好用的功能. 选择设置 选择窗口 -> 选择行为 看那个窗口移动和调整大小的特殊键 Alt 好了按住alt在滑动滑轮 世界不一样了 对于小屏幕高分辨率 ...

  2. golang 正则表达式 匹配局域网

    做一个微服务,需要对http头域里的remoteip做访问限制:所有局域网都要鉴权,其中一些特殊ip,如网关地址,直接拒绝,防止公网访问.正则表达式很好的解决了这个,直接贴代码,读者拿来直接改改就能用 ...

  3. 20145226夏艺华 逆向及Bof基础实践

    逆向及Bof基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串,如图所示: 该程序同时 ...

  4. 杭州优步uber司机第二组奖励政策

    -8月9日更新- 优步杭州第二组: 定义为激活时间在2015/6/8之后2015/8/3之前的车主(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com ...

  5. P1011 车站

    P1011 车站 题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为 ...

  6. 机器学习实战:决策树的存储读写文件报错(Python3)

    错误原因:pickle模块存储的是二进制字节码,需要以二进制的方式进行读写 1. 报错一:TypeError: write() argument must be str, not bytes 将决策树 ...

  7. 封装一个CSVHelper

    public class CSVHelper { /// <summary> /// CSV转换成DataTable(OleDb数据库访问方式) /// </summary> ...

  8. SpringBoot-01:什么是SpringBoot?

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- SpringBoot: Spring Boot可以轻松创建独立的,生产级的基于Spring的应用程序,您可以“ ...

  9. The 2018 ACM-ICPC Asia Qingdao Regional Contest K XOR Clique

    K XOR Clique BaoBao has a sequence a​1​​,a​2​​,...,a​n​​. He would like to find a subset S of {1,2,. ...

  10. Fiddler使用总结(一)

    Fiddler基础知识 .Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. .代理就 ...