`
skeeey
  • 浏览: 34132 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

映射表(二)

阅读更多
上一篇从数据结构方面简单介绍了映射表,这一篇介绍java对这一数据结构的实现,java提供了种类繁多的map,主要从两个方面一个是hash的方式(HashMap),另外一种是树形结构(TreeMap),两者都实现了map接口.
  谈到HashMap就不得不说HashTable,那么它们两个有什么不同呢?[java的面试或笔试题出现几率比较高的一题],HashTable是java对映射表的最早实现,它不但实现了映射表而且是线程安全的,不过它控制线程安全的方式比较直接,只是对该同步的方法进行了同步(使用synchronize关键字) ,也正是因为这样,所以导致HashTable的速度不如HashMap,这是最直接的解释,但实际上HashMap对HashTable作了很多细节上的改进,比如HashTable只是简单的使用要存入映射表的元素
(Key,value)的中的Key的HashCode。而HashMap对Key进行了再散列,这样严格确保了HahsCode的唯一性,同时它的Hash函数要比HashTable高效只是简单的用了一句
// h is hashcode
// length is length of the map
return h & (length-1);

恰好这种计算映射表中元素位置的方法也于python一样(不知道是谁学谁的),再比如他在确定元素的Key是否相同时也使用了比较严格的比较方式,等等,但是它们两个处理冲突的方式是一致的,使用的都是链地址法,而这种方法适合于经常进行插入和删除的情况。所以建议使用HashMap,但如果我们需要同步的Map该怎么办?有很多方法,但是jdk1.5为我们提供一种更高效的方式,直接使用ConcurrentHashMap类,因此如果是基于jdk1.5以上的开发,请尽量使用ConcurrentHahMap。[关于这个类因为牵扯到了线程方面的问题,想单独讨论]。
   接下来讨论一下HashMap的装填因子,和容量,还有初始的大小,如果不去显示的指定这些,那么HashMap默认的装填因子是0.75,初始化大小为16,因此在一个HashMap最初的容量是16 * 0.75 = 12,如果我们使用0.75这个装填因子,那么Map的大小必须是2的n次幂,一个HashMap的大小是2的30次幂(很大哦,以至于java的实现都没使用字面量,而是使用了一个移位运算
1 << 30).
   基于HashMap,又派生了LinkedHashMap还有IdentityHashMap,对于IdentityHashMap,键的散列码不是key的HashCode,而是Key的内存地址,因此,它使用==比较两个对象,而不是equals方法。对于LinkedHashMap,它通过使用双向链表,使得插入映射表中的元素,在表面上具有了按插入顺序的顺序,groovy的map使用的就是这个类。
   其它的还有WeakHashMap和EnumMap(由于篇幅,下次讨论)
   对于TreeMap,它的实现是基于搜索树的数据结构,因此它是允许对映射表的元素进行排序的。[由于这又牵扯到了数据结构,在此只是简单的提一下],因此如果没有对元素顺序的特殊要求,请使用HashMap,因为在存储和查询它的效率都要优于树结构。

分享到:
评论

相关推荐

    MMU一、二级映射表

    ### MMU一、二级映射表详解 #### 1. 概述 现代计算机系统为了高效管理和使用内存资源,引入了内存管理单元(MMU,Memory Management Unit)。MMU不仅负责将程序使用的虚拟地址空间映射到实际的物理地址空间,而且还...

    数据类型关系映射表

    ### 数据类型关系映射表详解 #### MySQL 数据类型与 JDBC 映射 - **BIGINT (MySQL) → BIGINT (JDBC)** - **解释**:MySQL 中的大整数类型对应 JDBC 中的大整数类型。 - **注意事项**:在 MySQL 中,`BIGINT` ...

    条形码的识别器(源码)

    条形码识别程序 操作环境:本程序可以运行于Microsoft Windows 98/ME/NT/2000/XP下。 分辨率:任何分辨率即可 ...n 绘制条形码:通过映射表二得到的二进制数码进行绘制,1对应黑线,0对应白线。

    条形码识别器

    条形码识别程序操作环境:本程序可以运行于Microsoft Windows 98/ME/NT/2000/XP下。 分辨率:任何分辨率即可 制作工具...数字-字母映射表 n 绘制条形码:通过映射表二得到的二进制数码进行绘制,1对应黑线,0对应白线。

    selenium之 chromedriver与chrome版本映射表

    ### Selenium之Chromedriver与Chrome版本映射表详解 #### 一、引言 随着Web自动化测试技术的发展,Selenium已成为业界广泛使用的自动化测试工具之一。而在使用Selenium进行Web自动化测试时,Chromedriver作为...

    hibernate的映射表生成器

    标题中的“hibernate的映射表生成器”是一个图形用户界面(GUI)工具,专门设计用于帮助开发者自动生成数据表,其基于对象模型(po)和映射文件(XML文件)。这个工具的出现,极大地提高了开发效率,减少了手动创建...

    uart_update.zip_RAM映射表_flash映射ram

    标题中的“uart_update.zip_RAM映射表_flash映射ram”涉及到的是嵌入式系统开发中的两个关键概念:UART(通用异步收发传输器)更新和内存映射。UART是一种常见的串行通信接口,用于设备间的通信。RAM映射表和Flash...

    GBK与Unicode码对照表.rar

    GBK与Unicode的映射表,如"GBK与Unicode码对照表.txt"所示,是用来转换两者编码的关键工具。这个对照表列出了GBK编码下的每个字符对应的Unicode值。这对于在GBK编码环境下处理Unicode文本,或者在Unicode环境下处理...

    国家二字码和货币映射表

    世界各国二字码和货币码

    SSD中一种地址映射算法研究

    页映射性能好,但是映射表占用空间大;块映射的映射表占用空间小,但是性能差。本文研究了一种通过算法给定的阀值来判定使用页映射还是混合映射,这样动态的转化使系统映射速度快,空间利用率高,同时也降低了系统...

    hibernate动态映射表处理oracle的clob类型

    本主题“hibernate动态映射表处理Oracle的CLOB类型”主要聚焦于如何在Hibernate中有效地管理和操作CLOB字段。在Oracle 10g中,CLOB数据类型的处理有时会遇到一些挑战,尤其是在与ORM框架结合使用时。以下将详细介绍...

    qpsk调制解调与星座图映射

    2. 将二进制数据映射到星座图上的点,形成复数符号。 3. 对复数符号进行载波调制,生成模拟信号。 4. 可能会添加高斯白噪声来模拟实际信道。 5. 进行解调,通常使用匹配滤波器或者相干解调。 6. 映射回二进制数据,...

    映射表控制研究 (2005年)

    #### 二、映射表的应用 - **模糊控制**: 模糊控制是一种基于模糊逻辑的控制策略,适用于处理复杂的、不确定的系统。映射表在模糊控制中的应用可以通过调整采样点来逼近模糊规则,从而实现相似的控制效果。 - **仿真...

    球二维图案纹理映射C++.zip

    本项目“球二维图案纹理映射C++.zip”聚焦于利用C++实现一系列相关算法,包括分数维图案、双三次Bezier曲面以及将二维图案映射到球体表面的方法。 首先,分数维图案是一种复杂而有趣的数学概念,常用于生成自相似或...

    myBatis映射数据库表

    在MyBatis中,映射数据库表是实现数据访问的关键步骤。本文将深入探讨MyBatis中的mapper、model(实体类)和DAO(数据访问对象)的概念,以及如何通过MyBatis Generator自动生成相关代码。 1. **Mapper接口与XML...

    MFC中消息映射机制分析

    2. **消息映射表实现**:实际的消息映射表是在类的实现文件中定义的,使用`BEGIN_MESSAGE_MAP`和`END_MESSAGE_MAP`宏来标记消息映射表的开始和结束,并通过诸如`ON_COMMAND`这样的宏来关联消息和处理函数。...

    二维纹理映射

    二维纹理映射是计算机图形学中的一个重要概念,它涉及到如何将二维图像(纹理)应用到三维模型表面,以增加视觉真实感。在这个场景中,我们讨论的是如何将一个立方体的六个面分别映射上不同的颜色,然后通过旋转立方...

    数据结构:映射.pdf

    数据结构中的映射,通常指的是关联数组或哈希表,是一种高效的数据组织方式,用于存储键值对。在C++中,`map`是映射的一种实现,它内部基于红黑树,提供O(log n)的时间复杂度进行查找、插入和删除操作。红黑树是一种...

    Execl如何轻松搞定多对多账户映射.docx

    在工作簿中设置“用户映射表”,并导入所有员工的姓名,这是基础的数据源。同时,从各个应用系统的数据库中导出账号信息,并保存为Excel表格格式,然后把这些账号表导入到“映射表”中。在这个过程中,确保只保留...

Global site tag (gtag.js) - Google Analytics