1 集合初始化时,指定集合初始值大小。
说明:HashMap 使用 HashMap(int initialCapacity) 初始化,
正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loader factor)默认为
0.75,如果暂时无法确定初始值大小,请设置为 16。 反例:HashMap 需要放置 1024 个元素,由于没有 设置容量初始大小,随着元素不断增加,容
量 7 次被迫扩大,resize 需要重建 hash 表,严重影响性能。
/** * ArrayList大容量性能测试 */ private static void performance() { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); long a1 = System.currentTimeMillis(); for (int i = 0; i < SIZE; i++) { map.put(i, i); } long a2 = System.currentTimeMillis(); System.out.println("costs:" + (a2 - a1) + "ms"); // 预先设置大小 Map<Integer, Integer> map2 = new HashMap<Integer, Integer>(SIZE); for (int i = 0; i < SIZE; i++) { map2.put(i, i); } System.out.println("costs:" + (System.currentTimeMillis() - a2) + "ms"); } 结果: costs:692ms costs:364ms
2 遍历:使用增强for循环
使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。 说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效 率更高。
写道
/**
* map循环测试
*/
private static void forEach() {
Map<Integer, Integer> map = new HashMap<Integer, Integer>(SIZE);
for (int i = 0; i < SIZE; i++) {
map.put(i, i);
}
long time1 = System.currentTimeMillis();
Set<Entry<Integer, Integer>> set = map.entrySet();
for (Entry<Integer, Integer> entry : set) {
int code = entry.getKey().hashCode() + entry.getValue().hashCode();
}
long time2 = System.currentTimeMillis();
System.out.println("costs1:" + (time2 - time1) + "ms");
for (Integer key : map.keySet()) {
int code = key.hashCode() + map.get(key).hashCode();
}
long time3 = System.currentTimeMillis();
System.out.println("costs2:" + (time3 - time2) + "ms");
map.forEach((key, value) -> {
int code = key.hashCode() + value.hashCode();
});
long time4 = System.currentTimeMillis();
System.out.println("costs3:" + (time4 - time3) + "ms");
}
* map循环测试
*/
private static void forEach() {
Map<Integer, Integer> map = new HashMap<Integer, Integer>(SIZE);
for (int i = 0; i < SIZE; i++) {
map.put(i, i);
}
long time1 = System.currentTimeMillis();
Set<Entry<Integer, Integer>> set = map.entrySet();
for (Entry<Integer, Integer> entry : set) {
int code = entry.getKey().hashCode() + entry.getValue().hashCode();
}
long time2 = System.currentTimeMillis();
System.out.println("costs1:" + (time2 - time1) + "ms");
for (Integer key : map.keySet()) {
int code = key.hashCode() + map.get(key).hashCode();
}
long time3 = System.currentTimeMillis();
System.out.println("costs2:" + (time3 - time2) + "ms");
map.forEach((key, value) -> {
int code = key.hashCode() + value.hashCode();
});
long time4 = System.currentTimeMillis();
System.out.println("costs3:" + (time4 - time3) + "ms");
}
结果:
costs1:48ms
costs2:59ms
costs3:56ms
costs1:48ms
costs2:59ms
costs3:56ms
相关推荐
背景及相关工作哈希技术在大数据环境下应用广泛,能实现海量数据的高效插入和查询。本章主要介绍哈希技术的研究进展,哈希技术在列存储数据库分组和连接查询中的应用,以及
面试中,可能会被问及HashMap的性能优化、内存占用分析、以及在特定场景下的选择,如并发环境、内存敏感的应用等。 总结,HashMap是Java编程中的基础工具,掌握其工作原理和常见面试题,不仅能帮助我们应对面试,更...
### HashMap介绍和使用详解 #### 一、HashMap的数据结构 HashMap是Java集合框架的一个重要组成部分,它实现了Map接口,能够存储键值对映射。...理解HashMap的工作原理对于优化Java程序的性能具有重要意义。
5. **JDK1.7与1.8的HashMap优化**: - **JDK1.7** 中,HashMap采用数组+链表的结构,当链表长度超过8时,链表会转换为红黑树,以降低查找、插入和删除的时间复杂度。 - **JDK1.8** 进一步优化了HashMap的性能,...
哈希映射(HashMap)是Java编程语言中广泛使用的...了解这些实现细节对于优化代码性能和避免潜在问题至关重要。在实际编程中,应充分考虑哈希冲突的处理、负载因子的选择以及预估容量的设定,以提高HashMap的使用效率。
- `HashMap`在哈希计算和扩容策略上的优化使其在大多数情况下都能提供更高的性能。 - 对于单线程环境或者不需要线程安全的场景,推荐使用`HashMap`。 #### 5. 初始化和最大容量 - **HashMap**: - 最大容量限制...
11. **HashMap的实现细节**:在Java 8之后,为了优化性能,当链表长度达到8时,HashMap会将链表转换为红黑树,这降低了查找、插入和删除的时间复杂度,尤其是在存在大量哈希冲突时。 综上所述,HashMap是一种高效且...
通过分析源码,开发者可以深入理解哈希表的工作原理,学习如何在易语言中实现高效的数据结构,这对于提升程序性能和优化内存管理至关重要。同时,这也为自定义数据结构或实现其他哈希表相关的功能提供了基础。
标题中的“mvcDemo-master2.rar”表明这是一个关于MVC架构的项目示例,可能是使用了某种版本控制系统(如Git)...这个示例对于理解SSM框架的工作原理和实际应用,以及如何利用HashMap优化数据处理都是很好的学习材料。
- 选择合适的初始容量(initialCapacity)和负载因子,以优化HashMap的性能。初始容量越大,扩容次数越少,但内存占用也会增加。 - 注意HashMap的并发问题,如果在多线程环境下,使用Collections.synchronizedMap()...
#### 五、使用HashMap优化 在Android应用开发中,`HashMap`是一种非常常见的数据结构。为了提高效率,建议遵循以下几点: - **优先选择HashMap**:除非有特殊需求,否则建议首选`HashMap`作为`Map`接口的实现类。...
文章目录一.HashMap是什么二.HashMap继承类对比分析三.HashMap源码相关单词含义四.HashMap如何确定哈希桶数组索引位置五. HashMap 的 put 方法分析六.HashMap扩容机制七.HashMap线程安全性 一.HashMap是什么 ...
综上所述,《HASHMAP缓存.txt》文档不仅介绍了HashMap作为缓存的基本概念和实现方式,还涉及到了单例模式、线程安全、性能优化等高级主题,为开发者提供了丰富的技术细节和实用建议。在实际开发中,合理运用这些知识...
在JDK 8中,HashMap进行了重大的优化,引入了红黑树(Red-Black Tree)的概念,当链表长度超过一定阈值(默认为8)时,会将链表转换为红黑树,以提高查找效率。在进行put操作时,首先计算键对象的哈希值,然后根据...
本文将深入探讨如何利用Go语言构建一个无锁线程安全的HashMap,特别关注其优化读取访问速度的设计策略。 HashMap是编程中常见的数据结构,用于存储键值对。在多线程环境中,为了保证数据的一致性和正确性,通常需要...
此外,博客中可能还会讨论到性能优化,如使用`Object.create(null)`来创建一个没有原型的对象,避免不必要的属性查找,以及如何处理`null`和`undefined`作为键的情况,因为它们在JavaScript中被视为`falsey`值。...
哈希映射(HashMap)是Java编程语言中一个非常重要的数据结构,它在《简单的key value hashmap》中被提及,通常用于存储键值对(key-value pairs)...因此,合理选择数据结构以及正确使用HashMap是优化程序性能的关键。
为了优化性能,HashMap通常会动态调整其容量,以保持较低的装载因子(load factor),通常是0.75,以减少冲突。 在实际项目中,对HashMap进行优化主要涉及以下几个方面: 1. 初始化容量:避免HashMap自动扩容,...
同时,理解HashMap的内部机制对于优化查询性能和处理潜在问题至关重要。在实际项目中,还需要考虑如何优雅地处理异常情况,以及如何与其他系统组件进行有效集成,以构建完整的词典查询解决方案。