`

HashSet HashTable HashMap的区别

    博客分类:
  • java
 
阅读更多

(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到).

(2)HashSet以对象作为元素,它拒绝接受重复的对象,而HashMap以(key-value)的一组对象作为元素,可以看作三个视图:key的Set,value的Collection,Entry的Set。 这里HashSet其实就是HashMap的一个视图。

其实HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。往HashSet中插入对象,内部其实只不过是做了

            public boolean add(Object o) {

                      return map.put(o, PRESENT)==null;
            }

 现在来看hastTable和hashMap的区别:

(1)Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

(2)这个不同即是最重要的一点:Hashtable中的方法是同步的,而HashMap方法(在缺省情况下)是非同步的。即是说,在多线程应用程序中,不用专门的操作就可以安全地使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
     Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

(3)只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。

 

其它的一些资料:

1.HashTable的方法是同步的,HashMap不是同步的,所以在多线程场合要手动同步HashMap,这个区别就像Vector和ArrayList一样。(最主要的区别)
       2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以,只容许有一个null值的key,可以有多个null值的value)。
      3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
      4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
      5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
      6.哈希值的使用不同,

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

static int hash(Object x) {
   int h = x.hashCode();
   h += ~(h << 9);
   h ^= (h >>> 14);
   h += (h << 4);
   h ^= (h >>> 10);
   return h;
}
static int indexFor(int h, int length) {
   return h & (length-1);
}

分享到:
评论

相关推荐

    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相当,但由于...

    Hashtable和HashMap的区别:

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

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

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

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

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

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

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

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

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

    Java中HashMap和Hashtable及HashSet的区别

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

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

    `HashMap`、`Hashtable`和`HashSet`都是基于`Map`或`Set`接口实现的不同数据结构,它们在功能、线程安全性和性能等方面有显著差异。 首先,`HashMap`和`Hashtable`都实现了`Map`接口,这意味着它们都可以存储键值对...

    hashmap面试题_hashmap_

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

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

    ArrayList和LinkedList虽然不是Set,但它们的父接口List属于Collection,而Collection接口有一个子接口Set,例如HashSet是Set接口的一个实现,它内部基于HashMap实现,保证元素唯一性。 7. WeakHashMap WeakHashMap...

    HashMap 概述 精讲 .md

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

    我的面试问题总结.docx

    4. HashMap vs HashTable:HashMap是非线程安全且允许null键和值,而HashTable是线程安全且不允许null键值。 5. HashSet vs TreeSet:HashSet基于HashMap实现,插入和查找较快,但无特定排序;TreeSet基于TreeMap,...

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

    本资源摘要信息涵盖了 Java 集合框架的基本概念和实现细节,着重介绍了 Java 集合框架中的 HashMap、Hashtable、ArrayList、LinkedList 等常用类,并对比了 Hashtable 和 HashMap 的区别,详细分析了两者在源代码...

    集合框架的各自区别.pdf

    HashSet基于HashMap,插入和查找速度快,但无序;TreeSet内部使用红黑树实现,保证元素有序,插入和查找速度较HashSet慢。 二、Map接口 Map接口用于存储键值对,不包含在Collection接口中。HashMap、HashTable和...

    应聘Java笔试时可能出现问题

    本文将深入探讨Java基础、集合框架以及常见数据结构如ArrayList、Vector、HashMap和Hashtable之间的区别。 1. **Java访问修饰符**:在Java中,`public`、`private`、`protected`以及默认(无修饰符)定义了类成员的...

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

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

    java8源码-putaoo.github.io:putao.github.io

    区别、HashMap的底层实现、HashMap 和 Hashtable 的区别、HashMap 的长度为什么是2的幂次方、HashSet 和 HashMap 区别、ConcurrentHashMap 和 Hashtable 的区别、ConcurrentHashMap线程安全的具体实现方式/底层具体...

    java8源码-java-start::seedling::seedling::seedling:学习Java语法过程中的一些案例

    区别、HashMap的底层实现、HashMap 和 Hashtable 的区别、HashMap 的长度为什么是2的幂次方、HashSet 和 HashMap 区别、ConcurrentHashMap 和 Hashtable 的区别、ConcurrentHashMap线程安全的具体实现方式/底层具体...

    深入探索Java集合框架:解密复杂的面试题和精准解析

    4. **HashMap和Hashtable的区别** - **HashMap** 非线程安全,允许null键和null值,适合单线程环境。 - **Hashtable** 线程安全,不允许null键和null值,适合多线程环境。 5. **ConcurrentHashMap和Hashtable的...

Global site tag (gtag.js) - Google Analytics