`

如何高效的使用HashMap

    博客分类:
  • JDK
阅读更多
HashMap是知道怎么实现的了,哈哈,那么我们应该怎么使用HashMap才能达到最高的效率
HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使
用TreeMap(HashMap中元素的排列顺序是不固定的)。

使用HashMap,重写HashCode()的原则:
1.不必对每个不同的对象都产生一个唯一的hashcode,只要你的HashCode方法使get()能够得到put()放进去的内容就可以了。即"不为一原则"。
2.生成hashcode的算法尽量使hashcode的值分散一些,不要很多hashcode都集中在一个范围内,这样有利于提高HashMap的性能。即"分散原则"。
这两条的意思是hashCode可以返回一样,但是尽量不同。
当以对象作为key传递时,HashMap会取对象的hashCode()方法来进行位运算得到在HashMap中数组的下标(见HashMap源码解析).
如果不同的对象都产生一个唯一的hashCode(),那么其离散度会大一点,也就是取的时候可能直接根据下标得到对象。
第一条原则还有一点,你的HasCode方法使get()能够得到put(0放进去的内容,也就是说你的hashCode可以相同,那么你根据对象key得到的
就是木桶链(见HashMap源码解析),循环木桶链必须能够找到所对应的内容,这也是为什么我们要重写hashCode()和equals()方法的原因了

以下是我整理出来的原则,我们不仿把对象比喻成数据库的表,HashCode()比喻成其唯一键(可以是组合唯一键),equals()方法来得到唯一键计算的结束。[唯一键不同就为不同的对象],当然还有一种情况,我这张表(对象)没有唯一键怎么办,那么HashCode()方法根据离散原则尽量返回不同的值[int],在equals()方法必须判断其唯一性或者至少符合你的业务逻辑的需要.
0
0
分享到:
评论

相关推荐

    详解HashMap源码解析(下).doc

    在HashMap的实现中,添加元素的关键操作是`put...理解这些机制对于高效使用HashMap和解决相关问题至关重要。此外,HashMap是非线程安全的,如果在多线程环境下使用,需要采取同步控制措施,如使用`ConcurrentHashMap`。

    HashMap介绍和使用

    Java中HashMap使用的哈希函数是基于键的哈希码进行计算。具体计算方式如下: ```java static int indexFor(int h, int length) { return h & (length - 1); } ``` 这里的`length`是指数组的长度,必须是2的幂。...

    C++hashmap的使用实例

    在C++编程中,`hashmap`通常指的是`std::unordered_map`,它是一个关联容器,提供了基于哈希表的键值对存储。这个数据结构允许我们以接近常数时间的复杂度进行插入、查找和删除操作,极大地提高了程序的执行效率。...

    Go-rhh一个简单而高效的Go的hashmap包

    它提供了非常快的计算速度,适合于大数据量的哈希需求,是构建高效HashMap的理想选择。 "Go-rhh"包的特性可能包括: 1. 高效性:结合了xxhash的快速哈希计算和罗宾·胡德散列的低平均查找时间。 2. 简洁性:作为一...

    hashmap实现原理

    通过`hashCode()`和`equals()`的合理使用,以及数组和链表的结合,HashMap实现了高效的键值对存储和查找。了解这些实现细节对于优化代码性能和避免潜在问题至关重要。在实际编程中,应充分考虑哈希冲突的处理、负载...

    HashMap之resize()方法源码解读.docx

    HashMap之resize()方法源码解读 HashMap的resize()方法是HashMap...在resize()方法中,我们可以看到HashMap的扩容机制是如何工作的,并了解到HashMap使用了power-of-two expansion机制和threshold字段来记录扩容阈值。

    HashMap和HashTable的区别和不同

    这种方法在某些情况下可能不如`HashMap`的扩容策略高效。 #### 4. 性能对比 - **HashMap**通常比**HashTable**具有更好的性能。原因包括: - `HashMap`的非线程安全设计减少了同步开销。 - `HashMap`在哈希计算...

    HashMap的数据结构

    为了解决这个问题,HashMap使用了链地址法,即在每个数组索引位置上存储一个链表,碰撞的键值对会被链接到同一个索引位置的链表上。 1. **哈希函数**:哈希函数是HashMap的核心,它的目标是将键转换为数组的索引。...

    Java中HashMap详解(通俗易懂).doc

    1. **哈希函数**:HashMap使用键对象的hashCode()方法生成哈希码,这个哈希码用于确定元素在内部数组中的位置。哈希函数的目标是尽可能地将不同的键映射到不同的桶,以减少冲突。 2. **哈希冲突解决**:尽管哈希...

    HASHMAP缓存.txt

    此外,虽然HashMap提供了高效的内存访问,但如果缓存中存储了大量或过大的对象,可能会导致垃圾回收器的压力增大,影响程序性能。 #### 性能优化与最佳实践 为了最大化HashMap缓存的效率,可以采取以下几种策略: ...

    简单的key value hashmap

    HashMap是Java集合框架的一部分,它提供了高效的查找、插入和删除操作,平均时间复杂度为O(1)。在深入探讨HashMap之前,我们需要理解其基本概念。 HashMap基于哈希表实现,哈希表是一种通过计算键的哈希码来快速...

    hashmap 实例

    此外,当容量需要扩大时,Vector 扩容为原来的两倍,ArrayList 只扩大50%,使得 ArrayList 在内存使用上更为高效。 **Hashtable 和 HashMap:** 两者都是基于哈希表的数据结构,但 Hashtable 是线程安全的,而 ...

    用hashmap实现词典查询

    如果存在冲突(多个键映射到同一个位置),HashMap通常会使用链表或红黑树来处理这些冲突,确保查找效率仍然保持较高。 为了实现词典查询,我们需要以下步骤: 1. **读取字典文件**:字典文件通常包含一系列词条,...

    cpp-sparsemap一个高效hashmap和hashset的C实现

    本文将深入探讨一种名为cpp-sparsemap的实现,它是一个高效且轻量级的哈希映射(HashMap)和哈希集合(HashSet)的C++实现,主要由Tessil团队开发,并存储于Tessil-sparse-map-162cc7b版本的代码库中。 cpp-...

    java 使用web service读取HashMap里的数值

    2. **HashMap**:Java集合框架的一部分,是一种键值对存储结构,提供了非常高效的查询和修改操作。 #### 实现步骤 ##### 第一步:创建WebService接口 为了更好地展示整个过程,我们首先需要创建一个简单的...

    HashMap类.rar

    1. **哈希表**:HashMap使用哈希表来存储键值对。哈希表是一种数据结构,通过计算对象的哈希值来确定其在表中的位置,以便快速访问。 2. **键值对**:每个元素都由一个键(Key)和一个值(Value)组成,键不能重复...

    hashmap 集合

    在Java编程中,HashMap集合是开发者经常使用的数据结构之一,尤其在处理大量数据时,它的高效性和灵活性使得它成为首选。HashMap是Java集合框架的一部分,位于`java.util`包下,实现了Map接口,用于存储键值对(key-...

    HashMap与HashTable区别

    不同之处在于,`HashMap`在散列冲突处理上采用了更高效的链地址法,并且在散列表容量不足时会自动调整容量。 #### 五、初始化容量与负载因子 - **HashTable**: 默认初始容量为11,而默认负载因子为0.75。 - **...

    易语言HashMap类

    易语言HashMap类是一种在...这些知识点涵盖了易语言HashMap类的基本操作和工作原理,理解和熟练运用这些概念对于高效地使用HashMap类至关重要。通过深入学习和实践,开发者可以更好地利用HashMap类解决实际编程问题。

    Javascript实现和操作HashMap

    - 如果需要处理大量数据或执行复杂操作,考虑使用更高效的数据结构,如`Map`对象,尽管它不完全等同于HashMap。 总结来说,JavaScript的HashMap实现主要依赖于内置对象的特性,通过自定义类可以创建自己的HashMap...

Global site tag (gtag.js) - Google Analytics