HashMap和Hashtable的区别

本文详细对比了Hashtable与HashMap两个类的不同之处,包括继承关系、null值处理、同步性、遍历方式、hash数组大小及hash值计算方法等方面。

首先来看这两个类:

1 public class Hashtable<K,V>
2     extends Dictionary<K,V>
3     implements Map<K,V>, Cloneable, java.io.Serializable {
4 
5 public class HashMap<K,V>
6     extends AbstractMap<K,V>
7     implements Map<K,V>, Cloneable, Serializable

1. Hashtable类是继承自Dictionary类,且实现了Map了接口,而HashMap继承自AbstractMap类

2. Hashtable的key和value都不允许为null,而HashMap允许一个key为null,value可以有任意多个null
3. Hashtable是同步的,而HashMap是非同步的

4. Hashtable遍历使用Enumeration,即

 public synchronized Enumeration<K> keys() {
return this.<K>getEnumeration(KEYS);
    }
 
    public synchronized Enumeration<V> elements() {
return this.<V>getEnumeration(VALUES);
    }
但是toString()方法使用的是Iterator,
而HashMap遍历使用Iterator。
 
5.  HashTable中hash数组默认大小是11,增加方式是old*2+1
HashMap中hash数组的默认大小是16,而且一定是2的指数。
 

6. Hash值的使用不同,HashTable直接使用对象的hashCode

int hash = key.hashCode();

int index = (hash & 0x7FFFFFFF)%tab.length;

而 HashMap重新计算hash值,而且用于代替求模:

int hash = hash(key.hashCode());

 

    static int hash(int h) {

        h ^= (h >>> 20) ^ (h >>> 12);

        return h ^ (h >>> 7) ^ (h >>> 4);

    }

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击&quot;添加内容&quot;按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击&quot;大飞哥软件自习室&mdash;&mdash;快捷粘贴工具.exe&quot;文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击&quot;添加内容&quot;按钮 - 在弹出的对话框中设置热键分组 - 点击&quot;确定&quot;保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击&quot;编辑&quot;按钮 - 修改内容或热键设置 - 点击&quot;确定&quot;保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击&quot;删除&quot;按钮 - 在确认对话框中点击&quot;确定&quot;即可删除
HashMap Hashtable 都是用于存储键值对的数据结构,它们在功能上非常相似,但也存在一些区别。 1. 线程安全性:Hashtable 是线程安全的,即多个线程可以同时访问一个 Hashtable 实例而不需要额外的同步措施。而 HashMap 不是线程安全的,如果多个线程同时访问一个 HashMap 实例,可能会导致数据不一致的问题。如果需要在多线程环境下使用,可以考虑使用 ConcurrentHashMap。 2. null 键 null 值:Hashtable 不允许键或值为 null,如果尝试将 null 键或 null 值放入 Hashtable 中,会抛出 NullPointerException。而 HashMap 允许键值为 null,可以正常存储获取 null 值。 3. 继承关系:Hashtable 是 Dictionary 类的子类,而 HashMap 是 AbstractMap 类的子类。由于继承关系的不同,导致它们在实现上有一些差异。 4. 迭代顺序:HashMap 不保证迭代顺序,即遍历 HashMap 的键值对时,不一定按照插入顺序或者其他顺序进行遍历。而 Hashtable 的迭代顺序是按照插入顺序进行的。 5. 性能:由于 Hashtable 是线程安全的,它在多线程环境下的性能可能会受到一定影响。而 HashMap 在单线程环境下的性能通常会更好。 总的来说,如果在单线程环境下使用,并且需要允许键或值为 null,可以优先选择使用 HashMap。如果在多线程环境下使用,或者需要保证迭代顺序,可以考虑使用 Hashtable
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值