`
simgsg
  • 浏览: 96017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Hashtable和HashMap的区别

 
阅读更多
<div style="font-size: 16px;" id="blogDetailDiv">Hashtable和HashMap的区别: <br>1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类; <br>2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决: <br><span style="font-weight: bold;">&lt;wbr&gt;Map Collections.synchronizedMap(Map m)&lt;/wbr&gt;</span>&lt;wbr&gt;&lt;br&gt;这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。 &lt;br&gt;3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。 &lt;br&gt;&lt;br&gt;&lt;span style="LINE-HEIGHT: 1.8em; COLOR: #ff0000; FONT-SIZE: 18px"&gt;Vector、ArrayList和List的异同&lt;/span&gt;&lt;wbr&gt;&lt;br&gt;线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。 &lt;br&gt;Collection &lt;br&gt;├List &lt;br&gt;│├LinkedList &lt;br&gt;│├ArrayList &lt;br&gt;│└Vector &lt;br&gt;│ └Stack &lt;br&gt;└Set &lt;br&gt;Map &lt;br&gt;├Hashtable &lt;br&gt;├HashMap &lt;br&gt;└WeakHashMap &lt;br&gt;Collection接口 &lt;br&gt;  Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 &lt;br&gt;  所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。 &lt;br&gt;  如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下: &lt;br&gt;    Iterator it = collection.iterator(); // 获得一个迭代子 &lt;br&gt;    while(it.hasNext()) { &lt;br&gt;      Object obj = it.next(); // 得到下一个元素 &lt;br&gt;    } &lt;br&gt;  由Collection接口派生的两个接口是List和Set。 &lt;br&gt;List接口 &lt;br&gt;  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 &lt;br&gt;和下面要提到的Set不同,List允许有相同的元素。 &lt;br&gt;  除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 &lt;br&gt;  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 &lt;br&gt;LinkedList类 &lt;br&gt;  LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 &lt;br&gt;  注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: &lt;br&gt;    List list = Collections.synchronizedList(new LinkedList(...)); &lt;br&gt;ArrayList类 &lt;br&gt;  ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 &lt;br&gt;size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 &lt;br&gt;  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 &lt;br&gt;  和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 &lt;br&gt;Vector类 &lt;br&gt;  Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。 &lt;br&gt;Stack 类 &lt;br&gt;  Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 &lt;br&gt;Set接口 &lt;br&gt;  Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。 &lt;br&gt;  很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。 &lt;br&gt;  请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。 &lt;br&gt;Map接口 &lt;br&gt;  请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 &lt;br&gt;Hashtable类 &lt;br&gt;  Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。 &lt;br&gt;  添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。 &lt;br&gt;Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。 &lt;br&gt;使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”: &lt;br&gt;    Hashtable numbers = new Hashtable(); &lt;br&gt;    numbers.put(“one”, new Integer(1)); &lt;br&gt;    numbers.put(“two”, new Integer(2)); &lt;br&gt;    numbers.put(“three”, new Integer(3)); &lt;br&gt;  要取出一个数,比如2,用相应的key: &lt;br&gt;    Integer n = (Integer)numbers.get(“two”); &lt;br&gt;    System.out.println(“two = ” + n); &lt;br&gt;  由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。 &lt;br&gt;  如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。 &lt;br&gt;  Hashtable是同步的。 &lt;br&gt;HashMap类 &lt;br&gt;  HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。 &lt;br&gt;WeakHashMap类 &lt;br&gt;  WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。 &lt;br&gt;总结 &lt;br&gt;  如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。 &lt;br&gt;  如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。 &lt;br&gt;  要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。 &lt;br&gt;  尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。&lt;span style="LINE-HEIGHT: 1.8em; COLOR: #ffffff"&gt;&lt;embed id="flash0" height="0" width="0" src="http://catche.qq.com/temp/20081209/4236888.swf" invokeurls="false" allownetworking="internal" allowscriptaccess="never" menu="false"&gt;&lt;/embed&gt;&lt;/span&gt;&lt;wbr&gt;&lt;!--v:3.2--&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;</div>
分享到:
评论

相关推荐

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    Hashtable和HashMap区别

    总之,`Hashtable`和`HashMap`虽然都是用来存储键值对的数据结构,但在线程安全、对null的支持、性能和使用场景上有明显的区别。同时,MVC模式、SQL查询语言的不同以及JSP与Servlet的关系也是开发者应该了解的重要...

    HashMap和HashTable的区别和不同

    ### HashMap与HashTable的区别详解 #### 引言 在Java编程中,`HashMap`与`HashTable`作为两种常用的数据结构,经常被用来存储键值对数据。尽管它们在功能上相似,但在实现细节、性能表现以及使用场景方面存在显著...

    hashtable和hashmap的区别

    ### Hashtable和HashMap的区别 在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都实现了`Map`接口,用于存储键值对。尽管它们有着相似的功能,但在实现细节和应用场景上存在显著差异。接...

    Hashtable和HashMap的区别:

    ### Hashtable与HashMap的区别详解 #### 一、基本概念与历史背景 在Java编程语言中,`Hashtable` 和 `HashMap` 都是用来存储键值对的数据结构。这两种数据结构虽然相似,但是在实现细节上存在显著差异。 1. **...

    Java 中 Hashtable 和 HashMap

    Java中的Hashtable和HashMap是两种常用的数据结构,它们都实现了Map接口,用于存储键值对。尽管它们有很多共同点,但在设计和使用上也存在一些重要的差异。 首先,从基本概念上来看,HashMap是一个不包含同步的哈希...

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    Java中HashTable和HashMap的区别_动力节点Java学院整理

    Java中的`HashTable`和`HashMap`都是实现`Map`接口的数据结构,用于存储键值对。两者虽然在功能上相似,但在实现细节和使用场景上有显著的区别。 首先,线程安全性是两者之间的一个关键差异。`HashTable`是线程安全...

    HashTable和HashMap的区别_动力节点Java学院整理

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List和ArrayList的区别。List是一个接口,而ArrayList是一个实现了...

    HashMap与HashTable和HashSet的区别

    ### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...

    hashMap和hashTable的区别

    ### hashMap和hashTable的区别 #### 一、简介与基本概念 `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在...

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    HashMap与HashTable的主要区别在于线程安全性和对null值的支持。HashMap是非同步的,意味着在多线程环境中,如果不进行适当的同步控制,可能会导致数据不一致。而HashTable是同步的,因此它在多线程环境下的安全性更...

    比较Vector、ArrayList和hashtable hashmap

    - HashMap 和 Hashtable 都实现了 Map 接口,HashMap 更快但不是线程安全的,而 Hashtable 是线程安全但较慢。WeakHashMap 则使用弱引用作为键,有助于防止内存泄漏。 - 在选择使用哪种数据结构时,需要考虑性能需求...

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap和HashTable源码...本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的存储结构、构造方法、get和put方法的源码分析、Hash表的特点和缺点、HashTable和HashMap的区别等内容。

    HashMap与HashTable区别

    下面将详细介绍`HashMap`和`HashTable`之间的区别。 #### 一、线程安全性 - **HashTable**: 是线程安全的。它通过内部同步(synchronized)机制确保了多线程环境下的安全性。这意味着在多线程环境中,对`HashTable...

    HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable是Java中两个常用的数据结构,都是基于哈希表实现的,但它们之间存在着一些关键的区别。本文将深入探讨HashMap和HashTable的底层原理,并总结常见的面试题。 HashMap的底层原理 HashMap是Java中...

    hashmap与hashtable区别

    ### HashMap与Hashtable的区别 在Java编程语言中,`HashMap`和`Hashtable`是两种非常重要的数据结构,它们都用于存储键值对。然而,在实际应用过程中,这两种数据结构有着本质的不同,下面将详细介绍这些差异。 ##...

    第9讲 对比Hashtable、HashMap、TreeMap有什么不同?1

    HashMap、Hashtable和TreeMap都是Java中实现Map接口的类,它们用于存储键值对数据,但各自具有不同的特点和使用场景。 HashMap是最常用的Map实现,它通过哈希表(散列表)实现,提供快速的插入、查找和删除操作,...

    HashMap与HashTable的区别(含源码分析)

    在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...

Global site tag (gtag.js) - Google Analytics