文档章节

vector与ArrayList、hashmap与hashtable区别

谷亚彬
 谷亚彬
发布于 2017/07/21 13:52
字数 2287
阅读 15
收藏 0

一、vector与ArrayList区别

    首先要说明的是vector和arraylist都是list的实现类,都是代表链表的数据结构。

    说明:vector中使用到了synchronized关键字,也就是说vector是线程安全的!同理可知ArrayList是线程不安全的;

                所以vector中操作成员的方法必须保证同步才行,所以效率上就没有ArrayList的高;

                一般情况下,需要保持同步的情况下才使用vector,多数情况下使用ArrayList。

二、hashmap与hashtable

  1.     HashTable的方法是同步的,HashMap不能同步,所以在线程多的场合要使用HashTable;
  2. HashTable不允许空值(key和value都不可以为null),hashmap则可以为null
  3. HashTable有一个contains()的方法,功能和containsValue()一样
  4. HashTable使用Enumeration,而HashMap使用Iterator
  5. HashTabe中的hash数组默认大小为11,增长方式为old*2+1,hashmap的hash为16,是2的指数倍
  6. 哈希值的使用不同,HashTable直接使用对象hashcode,而HashMap会重新计算hash值
  7.      ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于ArrayList和HashMap。

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

    List接口 
      List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于java的数组。 
    和下面要提到的Set不同,List允许有相同的元素。 
      除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 
      实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 
    ArrayList类 
      ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 
    size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 
      每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 
      和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 
    Map接口 
      请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 
    HashMap类 
      HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

    ----------------------------------------------3楼----------------------------------------------------------

    1.
    List是接口,List特性就是有序,会确保以一定的顺序保存元素.
    ArrayList是它的实现类,是一个用数组实现的List.
    Map是接口,Map特性就是根据一个对象查找对象.
    HashMap是它的实现类,HashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>)
    2.
    一般情况下,如果没有必要,推荐代码只同List,Map接口打交道.
    比如:List list = new ArrayList();
    这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要:
    List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类
    这样,就不需要修改其它代码,这就是接口编程的优雅之处.
    另外的例子就是,在类的方法中,如下声明:
    private void doMyAction(List list){}
    这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.
    3.
    如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.
    可以参考The Art Of Computer Programming的Sorting and Searching部分

     

    下面的三个函数都是相等的..返回的都是new ArrayList() 

    public Collection getDomainsHelper(String sql) 

    Collection list=new ArrayList(); 
    return list; 



    public Collection getDomainsHelper(String sql) 

    List list=new ArrayList(); 
    return list; 



    public Collection getDomainsHelper(String sql) 

    return new ArrayList(); 


    Collection是List和Set两个接口的基接口 
    List在Collection之上增加了"有序" 
    Set在Collection之上增加了"唯一" 

    而ArrayList是实现List的类...所以他是有序的. 
    它里边存放的元素在排列上存在一定的先后顺序 

    而且ArrayList是采用数组存放元素 
    另一种List LinkedList采用的则是链表

     

     

    Vector 还是ArrayList――哪一个更好,为什么?

    要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑的因素:


    l API
    l 同步处理
    l 数据增长性
    l 使用模式


    下面针对这4个方面进行一一探讨


    API


    在由Ken Arnold等编著的《Java Programming Language》(Addison-Wesley, June 2000)一书中有这样的描述,Vector类似于ArrayList.。所有从API的角度来看这两个类非常相[b]似。但他们之间也还是有一些主要的区别的。

    同步性


    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)避免了同步、额外的方法调用和不必要的重新分配空间的操作。

     

© 著作权归作者所有

谷亚彬
粉丝 10
博文 74
码字总数 83668
作品 0
郑州
程序员
私信 提问
关于java.util.Vector 或 java.util.Hashtable类过时的讨论

某些高级IDE在检测代码成熟问题时,会报告集合是否过时的问题。目前过时的集合类有两个java.util.Vector 和 java.util.Hashtable 。 Vector的api描述是:从jdk 1.2版本开始,该类被修正为实现...

Barudisshu
2013/09/10
2.2K
2
hashmap和arraylist的区别

ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而 ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和HashTable...

MrBoyce
01/29
71
0
java容器学习

java容器: 容器,顾名思义,就是用来存放东西的道具,但是在我们程序开发中容器的概念就是用来存在我们数据对象的引用。 往常的数组存储,由于数组开始的长度已经指定,开发过程中不能随意修...

四月李
2015/12/17
149
0
浅谈JAVA集合框架 (引的)

Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection classes)。集合在java中非常重要,在讨论之前,先来看几...

厅一一
2009/07/21
0
0
map、set list 区别联系

List特点:元素有放入顺序,元素可重复 Map特点:元素按键值对存储,无放入顺序 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的Has...

weiliu007
2016/08/30
10
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部