HashMap和Hashtable区别?

作者&投稿:贝眨 (若有异议请与网页底部的电邮联系)
HashMap和Hashtable的区别~

Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
  
  也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
  
  第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。
  
  一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。
  
  关于Properties
  有时侯,你可能想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有一些例子,如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简单的方法,但Java提供了另外一种方法。
  
  Java.util.Properties类是Hashtable的一个子类,设计用于String keys和values。Properties对象的用法同Hashtable的用法相象,但是类增加了两个节省时间的方法,你应该知道。
  
  Store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。Load()方法正好相反,用来读取文件,并设定Properties对象来包含keys和values。
  
  注意,因为Properties扩展了Hashtable,你可以用超类的put()方法来添加不是String对象的keys和values。这是不可取的。另外,如果你将store()用于一个不包含String对象的Properties对象,store()将失败。作为put()和get()的替代,你应该用setProperty()和getProperty(),它们用String参数。
  
  好了,我希望你现在可以知道如何用hashtables来加速你的处理了。

Hashtable和HashMap的区别:
1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

两者最主要的区别在于hashtable是线程安全,而hashmap则非线程安全。
拓展资料:
hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言hashmap性能会高一些,我们平时使用时若无特殊需求建议使用hashmap,在多线程环境下若使用hashmap需要使用collections.synchronizedmap()方法来获取一个线程安全的集合(collections.synchronizedmap()实现原理是collections定义了一个synchronizedmap的内部类,这个类实现了map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的hashmap实例,简单的说就是collections.synchronizedmap方法帮我们在操作hashmap时自动添加了synchronized来实现线程同步,类似的其它collections.synchronizedxx方法也是类似原理。
hashmap可以使用null作为key,不过建议还是尽量避免这样使用。hashmap以null作为key时,总是存储在table数组的第一个节点上。而hashtable则不允许null作为key。
hashmap继承了abstractmap,hashtable继承dictionary抽象类,两者均实现map接口。
hashmap的初始容量为16,hashtable初始容量为11,两者的填充因子默认都是0.75。
hashmap扩容时是当前容量翻倍即:capacity*2,hashtable扩容时是容量翻倍+1即:capacity*2+1。
hashmap和hashtable的底层实现都是数组+链表结构实现。

Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java
1.2引进的Map接口的一个实现。
也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。
一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。
关于Properties
有时侯,你可能想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有一些例子,如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简单的方法,但Java提供了另外一种方法。
Java.util.Properties类是Hashtable的一个子类,设计用于String
keys和values。Properties对象的用法同Hashtable的用法相象,但是类增加了两个节省时间的方法,你应该知道。
Store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。Load()方法正好相反,用来读取文件,并设定Properties对象来包含keys和values。
注意,因为Properties扩展了Hashtable,你可以用超类的put()方法来添加不是String对象的keys和values。这是不可取的。另外,如果你将store()用于一个不包含String对象的Properties对象,store()将失败。作为put()和get()的替代,你应该用setProperty()和getProperty(),它们用String参数。
好了,我希望你现在可以知道如何用hashtables来加速你的处理了。

1、HashMap支持null Key和null Value;Hashtable不允许。这是因为HashMap对null进行了特殊处理,将null的hashCode值定为了0,从而将其存放在哈希表的第0个bucket。

2、HashMap是非线程安全,HashMap实现线程安全方法为Map map = Collections.synchronziedMap(new HashMap());Hashtable是线程安全

3、HashMap默认长度是16,扩容是原先的2倍;Hashtable默认长度是11,扩容是原先的2n+1

HashMap继承AbstractMap;Hashtable继承了Dictionary

4、扩展,HashMap 对比 ConcurrentHashMap ,HashMap 对比 SparseArray,LinkedArray对比ArrayList,ArrayList对比Vector


Java中的HashMap的工作原理是什么?
一,存储方式: Java中的HashMap是以键值对(key-value)的形式存储元素的。二,调用原理: HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合\/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,...

HashMap和Hashtable区别?
两者最主要的区别在于hashtable是线程安全,而hashmap则非线程安全。

hashmap允许null键和值吗
允许。HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null值。

hashtable和hashmap的区别是什么?
三、是否有contains方法 1、HashTable有一个contains(Object value)方法,功能和containsValue方法(Object value)功能一样。2、HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。四、可否允许有null值 key、value都是对象,但是不能拥有重复key值,value值可以重复出现。1、Hashtable中...

Hashtable,HashMap和TreeMap的区别
l (2)Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。l (3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的...

hashmap和concurrenthashmap的区别是什么?
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 ...

Java五个最常用的集合类之间的区别和联系
常用的集合类有一下几种:List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类 Map结构的集合类:HashMap类,Hashtable类 Set结构的集合类:HashSet类,TreeSet类 Queue结构的集合:Queue接口 HashMap和Hashtable的区别:HashMap和Hashtable都是java的集合类,都可以用来存放java对象,这是他...

Map接口,HashMap和HashTable的相同点和不同点分别是什么?
如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。Hashtable是同步的。HashMap类 HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即...

Java中HashMap和TreeMap的区别深入理解
HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体现在两个方面: 1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable(后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程rem...

hashtable为什么不能允许有null 键和值而 hashmap 为什么又允许有...
Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用...

通榆县13971869404: HashMap和HashTable的区别 -
苍狗骨肽: Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现.也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是....

通榆县13971869404: HashTable和HashMap的区别 -
苍狗骨肽: 1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null key和null value,而hashtable不允许. 2 HashTable是线程安全...

通榆县13971869404: HashMap和Hashtable的区别
苍狗骨肽:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable. HashMap允许将null作为一个entry的key或者value,而...

通榆县13971869404: Hashtable 和 HashMap 的区别:
苍狗骨肽: 答:HashMap 是 Hashtable的一个轻量级实现,HashMap里面的方法是异步的,效率要高,因为异步的时候大家都可以用,所以效率要高; 而Hashtable里面的方法不是异步的,而是同步的一个时间段里只能一个人访问所以效率要低.但是它保...

通榆县13971869404: Map接口,HashMap和HashTable的相同点和不同点分别是什么? -
苍狗骨肽:[答案] Hashtable和HashMap的区别:1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的.即是说,在多线程应用程序中,不用专门的操作就安全...

通榆县13971869404: Hashtable与HashMap有什么区别?
苍狗骨肽: 唯一的不同就是Hashtable是支持多线程同步访问的,也就是说,是多线程安全的.HashMap则不是多线程安全的,要想做到多线程安全,需要程序员自己做同步.

通榆县13971869404: HashTable与HashMap的区别 -
苍狗骨肽: a.Hashtable是继承自陈旧的Dictionary类的,HashMap继承自AbstractMap类同时是Java 1.2引进的Map接口的一个实现. b.也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是.这就意味着,然你可以不用采取任何特殊的行...

通榆县13971869404: Hashtable与HashMap有什么区别? -
苍狗骨肽: hashmap 线程不安全 允许有null的键和值 效率高一点、 方法外同步 有containsvalue和containsKey方法 HashMap 是Java1.2 引进的Map interface 的一个实现 HashMap是Hashtable的轻量级实现 hashtable 线程安全 不允许有null的键和值 效率稍低、 方法是是Synchronize的 有contains方法方法 、Hashtable 继承于Dictionary 类 Hashtable 比HashMap 要旧

通榆县13971869404: HashMap和HashTable之间有什么区别 -
苍狗骨肽: 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同.)此类不保证映射的顺序(顺序保存可以使用TreeMap或者数组列表),...

通榆县13971869404: 求问HashMap和Hashtable有什么区别和什么相同点? -
苍狗骨肽: HashMap和HashTable本质上是差不多的,在1.4版本以前是没有HashMap的 只有HashTable,他们的区别是HashTable是线程安全的,但是HashMap不是线程安全的,HashMap的性能要比HashTable好一些,所以,在不考虑线程安全的情况下,Java是推荐使用HashMap的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网