`

HashMap与HashTable的区别、HashMap与HashSet的关系

 
阅读更多
转自http://blog.csdn.net/wl_ldy/article/details/5941770
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。

一:HashMap与HashTable的区别
1.HashTable的方法是同步 的,在方法的前面都有synchronized来同步,HashMap未经同步,所以在多线程场合要手动同步

  HashMap这个区别就像Vector和ArrayList一样。



   1. 可以通过 
   2. Map m = Collections.synchronizedMap(new HashMap(...)); 
   3. 对HashMap进行同步操作。  

可以通过 Map m = Collections.synchronizedMap(new HashMap(...)); 对HashMap进行同步操作。
2.HashTable不允许null值(key和value都不可以) ,HashMap允许null值(key和value都可以)。

3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration进行遍历,HashMap使用Iterator进行遍历。




   1. HashTable的遍历: 
   2. Hashtable ht=new Hashtable(); 
   3.         ht.put("1", "111"); 
   4.         ht.put("3","333"); 
   5.         ht.put("2", "222"); 
   6.         Enumeration en=ht.keys(); 
   7.         while(en.hasMoreElements()){ 
   8.             Object key=en.nextElement(); 
   9.             Object value=ht.get(key); 
  10.             System.out.println("key="+key+",value="+value); 
  11.         } 

HashTable的遍历: Hashtable ht=new Hashtable(); ht.put("1", "111"); ht.put("3","333"); ht.put("2", "222"); Enumeration en=ht.keys(); while(en.hasMoreElements()){ Object key=en.nextElement(); Object value=ht.get(key); System.out.println("key="+key+",value="+value); }

HashMap的遍历参考:http://blog.csdn.net/wl_ldy/archive/2010/10/13/5939552.aspx
以上只是表面的不同,它们的实现也有很大的不同。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {

  h ^= (h >>> 20) ^ (h >>> 12);
     return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
  return h & (length-1);
}
以上只是一些比较突出的区别。

二、HashMap与HashSet的关系

1、HashSet底层是采用HashMap实现的:

   1. public HashSet() { 
   2.     map = new HashMap<E,Object>(); 
   3.     } 

public HashSet() { map = new HashMap<E,Object>(); }

2、

调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量。

   1. private static final Object PRESENT = new Object(); 
   2. public boolean add(E e) { 
   3.     return map.put(e, PRESENT)==null; 
   4.     } 
   5. public boolean remove(Object o) { 
   6.     return map.remove(o)==PRESENT; 
   7.     } 

private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; }

三、Properties类的特点,是否线程安全?


java.util.Properties 继承自 java.util.Hashtable ,所以Properties是线程安全的。
Properties 类表示一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串.
分享到:
评论

相关推荐

    HashMap与HashTable和HashSet的区别

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

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

    与HashSet的区别在于,HashSet是基于HashMap实现的集合类,用于存储唯一对象。HashSet中的元素没有顺序,添加元素时,HashSet会将元素转化为键放入HashMap中。因此,HashSet的插入和查找速度与HashMap相当,但由于...

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

    Map接口用于保存具有key-value映射关系的数据,常见的Map实现包括HashMap、TreeMap、HashTable和LinkedHashMap等。Queue是Java提供的队列实现。 本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的...

    浅析Java中Map与HashMap,Hashtable,HashSet的区别

    `HashSet`则是实现了`Set`接口,它不包含重复的元素,也没有顺序,但与`HashMap`和`Hashtable`不同,它不存储键值对,而是直接存储元素。`HashSet`的底层实现也依赖于`HashMap`,每个元素在`HashSet`中被视为一个键...

    Hashtable和HashMap的区别:

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

    Java中HashMap和Hashtable及HashSet的区别

    在Java编程语言中,`HashMap`、`Hashtable`和`HashSet`都是集合框架的重要组成部分,分别用于存储键值对和不重复元素。下面将详细解释它们之间的区别。 首先,`Hashtable`是`Map`接口的一个早期实现,它提供了一个...

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

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

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    ### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...

    hashmap面试题_hashmap_

    4. HashMap与Hashtable的区别? 答:HashMap非线程安全,而Hashtable是线程安全的;HashMap允许null键值,Hashtable不允;HashMap迭代器在修改时不会抛出ConcurrentModificationException,而Hashtable会。 5. ...

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

    与HashMap相比,HashTable的同步特性使得它在多线程环境下更安全,但在单线程环境下,由于同步开销,其性能较低。 5. LinkedList与ArrayList的比较 LinkedList是List接口的另一个实现,它基于双向链表实现,对于在...

    HashMap 概述 精讲 .md

    - **HashMap和HashTable的区别**:列举HashMap和HashTable的主要区别。 - **HashMap和HashSet的区别**:解释HashMap和HashSet之间的区别。 - **扩容机制**:HashMap是如何进行扩容的? - **长度限制**:解释为什么...

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    HashMap不是线程安全的,如果需要线程安全的Map,可以使用Hashtable。 LinkedHashMap与HashMap类似,但保持了插入顺序或访问顺序。TreeMap使用红黑树,保证了键的排序。 总的来说,理解这些集合的底层实现对于优化...

    农行研发中心-校招常见面试题汇总.pdf

    HashMap和HashTable的主要区别是HashMap线程不安全,而HashTable线程安全。 HashMap允许键值为null,而HashTable不允许键值为null。HashMap继承自AbstractMap,而HashTable继承自Dictionary。 在选择HashMap还是...

    Java集合框架源码剖析:HashSet 和 HashMap

     之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。  HashMap实现了Map...

    深入解读大厂java面试必考点之HashMap全套学习资料

    - HashMap与HashSet的关系? - 如何解决哈希冲突? - 如何自定义键的哈希码生成方式? - 如何避免和处理HashMap中的循环链表? 通过深入学习和理解这些知识点,你将能够在面试中自信地应对关于HashMap的问题,提升...

    求职宝典-Java 基础面试题

    HashMap和HashTable是Java中两种常用的基于哈希表的数据结构,它们的主要区别如下: 1. **父类不同**:HashMap继承自AbstractMap类,而HashTable继承自Dictionary类。AbstractMap是Map接口的一个抽象实现,提供了...

    阿里巴巴电话面试试题.doc

    2. Hashtable:Hashtable 是 Java 集合框架中的一种哈希表实现,与 HashMap 类似,但 Hashtable 是同步的,每个方法都是 synchronized,这使得 Hashtable 比 HashMap 更加安全,但同时也带来了性能开销。 3. HashSet...

    java软件工程师基础

    2. **ArrayList与Vector的区别,HashMap与Hashtable的区别**: - **ArrayList与Vector**: - 同步性:Vector是线程安全的,ArrayList不是。 - 扩容策略:Vector默认扩容为原大小的2倍,ArrayList为1.5倍。 - **...

    一些java面试经验pdf

    7. **HashMap与Hashtable、HashSet、TreeMap的区别**: - HashMap与Hashtable:HashMap非线程安全,而Hashtable是线程安全的,但性能较低,不推荐在现代Java中使用。 - HashMap与HashSet:HashMap存储键值对,...

Global site tag (gtag.js) - Google Analytics