java中哈希表及其应用详解

 更新时间:2015年06月10日 10:58:48   投稿:hebedich  
Java中哈希表(Hashtable)是如何实现的呢?Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例。假设我们保存下面一组数据,第一列作为key, 第二列作为value。

哈希表也称为散列表,是用来存储群体对象的集合类结构。

什么是哈希表

数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系。当要查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低。

一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录。这就需要在对象的存储位置和对象的关键属性(设为 k)之间建立一个特定的对应关系(设为 f),使每个对象与一个唯一的存储位置相对应。在查找时,只要根据待查对象的关键属性 k 计算f(k)的值即可。如果此对象在集合中,则必定在存储位置 f(k)上,因此不需要与集合中的其他元素进行比较。称这种对应关系 f 为哈希(hash)方法,按照这种思想建立的表为哈希表。

Java 使用哈希表类(Hashtable)来实现哈希表,以下是与哈希表相关的一些概念:

•容量(Capacity):Hashtable 的容量不是固定的,随对象的加入其容量也可以自动增长。
•关键字(Key):每个存储的对象都需要有一个关键字,key 可以是对象本身,也可以是对象的一部分(如某个属性)。要求在一个 Hashtable 中的所有关键字都是唯一的。
•哈希码(Hash Code):若要将对象存储到 Hashtable 上,就需要将其关键字 key 映射到一个整型数据,成为 key 的哈希码。
•项(Item):Hashtable 中的每一项都有两个域,分别是关键字域 key 和值域 value(存储的对象)。Key 和 value 都可以是任意的 Object 类型的对象,但不能为空。
•装填因子(Load Factor):装填因子表示为哈希表的装满程度,其值等于元素数比上哈希表的长度。

哈希表的使用

哈希表类主要有三种形式的构造方法:

    Hashtable(); //默认构造函数,初始容量为 101,最大填充因子 0.75
    Hashtable(int capacity);
    Hashtable(int capacity,float loadFactor)
哈希表类的主要方法如表 8-6 所示。

表 8-6 哈希表定义的常见方法

方法 功能
void clear() 重新设置并清空哈希表
boolean contains(Object value) 确定哈希表内是否包含了给定的对象,若有返回 true,否则返回 false
boolean containsKey(Object key) 确定哈希表内是否包含了给定的关键字,若有返回 true,否则返回 false
boolean isEmpty() 确认哈希表是否为空,若是返回 true,否则返回 false
Object get(Object key) 获取对应关键字的对象,若不存在返回 null
void rehash() 再哈希,扩充哈希表使之可以保存更多的元素,当哈希表达到饱和时,系统自动调用此方法
Object put(Object key,Object value) 用给定的关键字把对象保存到哈希表中,此处的关键字和元素均不可为空
Object remove(Object key) 从哈希表中删除与给定关键字相对应的对象,若该对象不存在返回 null
int size() 返回哈希表的大小
String toString() 将哈希表内容转换为字符串

哈希表的创建也可以通过 new 操作符实现。其语句为:

    HashTable has=new HashTable();

例子:

【例 8-12】哈希表的遍历。

//********** ep8_12.java **********
import java.util.*;
class ep8_12{
  public static void main(String args[]){
    Hashtable has=new Hashtable();
    has.put("one",new Integer(1));
    has.put("two",new Integer(2));
    has.put("three",new Integer(3));
    has.put("four",new Double(12.3));
    Set s=has.keySet();
    for(Iterator<String> i=s.iterator();i.hasNext();){
      System.out.println(has.get(i.next()));
    }
  }
}

运行结果:

2
1
3
12.3

相关文章

  • Spring Boot访问静态资源css/js,你真的懂了吗

    Spring Boot访问静态资源css/js,你真的懂了吗

    在搭建springboot时经常需要在html中访问一些静态资源,很多朋友不清楚如何在 Spring Boot中访问静态资源,本文给大家带来两种解决方案,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • springboot中使用redis的方法代码详解

    springboot中使用redis的方法代码详解

    &#8203;redis 作为一个高性能的内存数据库,如果不会用就太落伍了,之前在 node.js 中用过 redis,本篇记录如何将 redis 集成到 spring boot 中。感兴趣的朋友跟随小编一起看看吧
    2019-05-05
  • Java操作Word文档的全攻略(读取doc与docx文件)

    Java操作Word文档的全攻略(读取doc与docx文件)

    在当今办公自动化和文档处理场景中,Java开发者经常需要处理Word文档(.doc和.docx格式),无论是数据提取、文档转换还是内容分析,掌握高效的Word文档操作技术至关重要,本文将全面介绍Java中读取两种主流Word格式的技术方案、核心API和最佳实践,需要的朋友可以参考下
    2025-07-07
  • Java pdf文件书签承前缩放验证的设置方法

    Java pdf文件书签承前缩放验证的设置方法

    很多朋友不知道是什么是书签承前缩放,简单说就是可以任意改变当前pdf文档缩放比例,点击书签后不影响其缩放比率,本文给大家介绍下Java pdf文件书签承前缩放验证的设置方法,感兴趣的朋友一起看看吧
    2022-02-02
  • SpringBoot整合ES-Elasticsearch的实例

    SpringBoot整合ES-Elasticsearch的实例

    这篇文章主要介绍了SpringBoot整合ES-Elasticsearch的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Java数据库连接池之DBCP浅析_动力节点Java学院整理

    Java数据库连接池之DBCP浅析_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java数据库连接池之DBCP的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java中BigDecimal类的使用详解

    Java中BigDecimal类的使用详解

    这篇文章主要介绍了Java中BigDecimal类的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringBoot集成MyBatis中SQL拦截器的实战指南

    SpringBoot集成MyBatis中SQL拦截器的实战指南

    这篇文章主要为大家详细介绍了SpringBoot集成MyBatis中SQL拦截器的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • Java中图片转换为Base64的示例及注意事项

    Java中图片转换为Base64的示例及注意事项

    本文介绍了Base64编码的概念及其作用,同时列举了在实现图片转换为Base64过程中需要注意的问题,包括文件大小、读取异常、图片格式、网络传输效率以及数据安全性等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Ubuntu环境下的 RabbitMQ 安装与配置详细指南

    Ubuntu环境下的 RabbitMQ 安装与配置详细指南

    本文详解Ubuntu下RabbitMQ安装与配置,涵盖Erlang依赖安装、服务部署、管理界面启用及安全用户权限设置,强调多协议支持、高可用性设计和分布式场景适配,助力构建稳定可靠的消息队列系统,感兴趣的朋友跟随小编一起看看吧
    2025-09-09

最新评论