当前位置:  编程技术>java/j2ee

Java中HashMap和Hashtable及HashSet的区别

    来源: 互联网  发布时间:2014-10-27

    本文导语:  Hashtable类   Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。   添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。   Hashtable通过initial ...

Hashtable类  
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。  

添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。  

Hashtable通过initial   capacity和load   factor两个参数调整性能。通常缺省的load   factor   0.75较好地实现了时间和空间的均衡。增大load   factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。  

使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:  
Hashtable   numbers   =   new   Hashtable();  
numbers.put(“one”,   new   Integer(1));  
numbers.put(“two”,   new   Integer(2));  
numbers.put(“three”,   new   Integer(3));  

要取出一个数,比如2,用相应的key:  
Integer   n   =   (Integer)numbers.get(“two”);  
System.out.println(“two   =   ”   +   n);  

由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。  

如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。   Hashtable是同步的。  

HashMap类  
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null   value和null   key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load   factor过低。  

WeakHashMap类  
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

HashSet请参考对Set的描述  
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。  

Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。  
请注意:必须小心操作可变对象(Mutable   Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

两个通用Set实现是HashSet和TreeSet。要决定用哪一个,那是非常简单明了的。HashSet要快得多(对大多数操作是常数时间之于对数时间(constant   time   vs.   log   time)),   但不提供排序保证。如果你需要使用   SortedSet   中的操作,或者按顺序迭代对你来说是重要的,那么请使用   TreeSet。   否则,使用   HashSet。   在大多数时间都不使用   HashSet   ,对你来说是个公平的赌博。    

关于HashSet,有一件事应该牢记,即就条目数和容量之和来讲,迭代是线性的。因此,如果迭代性能很重要,那就应该慎重选择一个适当的初始容量。容量选得太大,既浪费空间,也浪费时间。   默认的初试容量是101,   一般来讲,它比你所需要的要多。可以使用   int   构造函数来指定初始容量。要分配   HashSet   的初始容量为17:    

Set  s=  new  HashSet(17);    

HashSets另有一个称作   装载因数(load   factor)的"调整参数(tuning   parameter)"   。如果你非常在乎你的HashSet的空间的使用,请阅读HashSet文本以获取详细信息。否则,就使用默认值吧。如果你接受默认装载因数,但你确实又想指定初始容量,那么,选一个大约是你期望你的   Set   将增长到的容量的两倍的数。如果你的猜测不着边,它也可以增长,或只是浪费一点空间。但都没有大问题。如果你知道有关正确尺寸的一个最佳值,用它吧;如果不知道,那就使用一个旧的值,或使用一个偶数值。它真的不是非常重要。这些事情只能使   HashSet   稍稍变好一点点。    

TreeSet没有调整参数。除clone之外,HashSet和TreeSet都仅有那些由它们各自的接口所要求的操作(Set和TreeSet),而没有任何别的操作。


    
 
 

您可能感兴趣的文章:

  • java命名空间java.util类hashtable<k,v>的类成员方法: hashtable定义及介绍
  • 请教:请问java中存放数据库中的记录,用什么数据结构?(hashtable?vector?还是别的?)
  • java命名空间java.util类hashtable<k,v>的类成员方法: clear定义及介绍
  • JAVA里哪一个数据结构库(hashtable,vector等)支持一对多的关系?
  • java命名空间java.util类hashtable<k,v>的类成员方法: rehash定义及介绍
  • 浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别
  • java命名空间java.util类hashtable<k,v>的类成员方法: tostring定义及介绍
  • 浅析Java中Map与HashMap,Hashtable,HashSet的区别
  • java命名空间java.util类hashtable<k,v>的类成员方法: clone定义及介绍
  • java中vector与hashtable操作实例分享
  • java命名空间java.util类hashtable<k,v>的类成员方法: keys定义及介绍
  • java hashtable实现代码
  • java命名空间java.util类hashtable<k,v>的类成员方法: isempty定义及介绍
  • java中Hashtable和HashMap的区别分析
  • java命名空间java.util类hashtable<k,v>的类成员方法: elements定义及介绍
  • 全面解析java中的hashtable
  • java命名空间java.util类hashtable<k,v>的类成员方法: containsvalue定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: hashcode定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: putall定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: containskey定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: contains定义及介绍
  • java命名空间java.util类hashmap<k,v>的类成员方法: hashmap定义及介绍
  • java HashMap的keyset实例
  • java命名空间java.util类hashmap<k,v>的类成员方法: clone定义及介绍
  • java HashMap通过value反查key的代码示例
  • java命名空间java.util类hashmap<k,v>的类成员方法: clear定义及介绍
  • Java中对HashMap的深度分析
  • java命名空间java.util类hashmap<k,v>的类成员方法: isempty定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢 iis7站长之家
  • java命名空间java.util类hashmap<k,v>的类成员方法: containskey定义及介绍
  • java无锁hashmap原理与实现详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util类hashset<e>的类成员方法: hashset定义及介绍
  • java命名空间java.util类hashset<e>的类成员方法: clone定义及介绍
  • java命名空间java.util类hashset<e>的类成员方法: clear定义及介绍
  • java命名空间java.util类hashset<e>的类成员方法: size定义及介绍
  • java命名空间java.util类hashset<e>的类成员方法: isempty定义及介绍
  • java命名空间java.util类hashset<e>的类成员方法: contains定义及介绍
  • java命名空间java.util类hashset<e>的类成员方法: add定义及介绍
  • java命名空间java.util类hashset<e>的类成员方法: remove定义及介绍
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3