`
- 浏览:
15025 次
- 性别:
- 来自:
大连
-
HashMap可谓JDK的一大实用工具,把各个Object映射起来,实现了“键--值”对应的快速存取。研究完我都汗颜了,其中 hash 就是通过 key 这个Object的 hashcode 进行 hash,然后通过 indexFor 获得在Object table的索引值。
HashMap可谓JDK的一大实用工具,把各个Object映射起来,实现了“键--值”对应的快速存取。但实际里面做了些什么呢?
在这之前,先介绍一下负载因子和容量的属性。大家都知道其实一个 HashMap 的实际容量就 因子*容量,其默认值是 16×0.75=12; 这个很重要,对效率很一定影响!当存入HashMap的对象超过这个容量时,HashMap 就会重新构造存取表。这就是一个大问题,我后面慢慢介绍,反正,如果你已经知道你大概要存放多少个对象,最好设为该实际容量的能接受的数字。
两个关键的方法,put和get:
先有这样一个概念,HashMap是声明了 Map,Cloneable, Serializable 接口,和继承了 AbstractMap 类,里面的 Iterator 其实主要都是其内部类HashIterator 和其他几个 iterator 类实现,当然还有一个很重要的继承了Map.Entry 的 Entry 内部类,由于大家都有源代码,大家有兴趣可以看看这部分,我主要想说明的是 Entry 内部类。它包含了hash,value,key 和next 这四个属性,很重要。put的源码如下
public Object put(Object key, Object value) {
Object k = maskNull(key);
这个就是判断键值是否为空,并不很深奥,其实如果为空,它会返回一个static Object 作为键值,这就是为什么HashMap允许空键值的原因。
int hash = hash(k);
int i = indexFor(hash, table.length);
这连续的两步就是 HashMap 最牛的地方!研究完我都汗颜了,其中 hash 就是通过 key 这个Object的 hashcode 进行 hash,然后通过 indexFor 获得在Object table的索引值。
table???不要惊讶,其实HashMap也神不到哪里去,它就是用 table 来放的。最牛的就是用 hash 能正确的返回索引。其中的hash算法,我跟JDK的作者 Doug 联系过,他建议我看看《The art of programing vol3》可恨的是,我之前就一直在找,我都找不到,他这样一提,我就更加急了,可惜口袋空空啊!!!
不知道大家有没有留意 put 其实是一个有返回的方法,它会把相同键值的 put 覆盖掉并返回旧的值!如下方法彻底说明了 HashMap 的结构,其实就是一个表加上在相应位置的Entry的链表:
for (Entry e = table[i]; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
Object oldvalue = e.value;
e.value = value; //把新的值赋予给对应键值。
e.recordAccess(this); //空方法,留待实现
return oldvalue; //返回相同键值的对应的旧的值。
}
}
modCount++; //结构性更改的次数
addEntry(hash, k, value, i); //添加新元素,关键所在!
return null; //没有相同的键值返回
}
我们把关键的方法拿出来分析:
void addEntry(int hash, Object key, Object value, int bucketIndex) {
table[bucketIndex] = new Entry(hash, key, value, table[bucketIndex]);
因为 hash 的算法有可能令不同的键值有相同的hash码并有相同的table索引,如:key=“33”和key=Object g的hash都是-8901334,那它经过indexfor之后的索引一定都为i,这样在new的时候这个Entry的next就会指向这个原本的 table[i],再有下一个也如此,形成一个链表,和put的循环对定e.next获得旧的值。到这里,HashMap的结构,大家也十分明白了吧?
if (size++ >= threshold) //这个threshold就是能实际容纳的量
resize(2 * table.length); //超出这个容量就会将Object table重构
所谓的重构也不神,就是建一个两倍大的table(我在别的论坛上看到有人说是两倍加1,把我骗了),然后再一个个indexfor进去!注意!!这就是效率!!如果你能让你的HashMap不需要重构那么多次,效率会大大提高!
说到这里也差不多了,get比put简单得多,大家,了解put,get也差不了多少了。对于collections我是认为,它是适合广泛的,当不完全适合特有的,如果大家的程序需要特殊的用途,自己写吧,其实很简单。(作者是这样跟我说的,他还建议我用LinkedHashMap,我看了源码以后发现,LinkHashMap其实就是继承HashMap的,然后override相应的方法,有兴趣的同人,自己looklook)建个 Object table,写相应的算法,就ok啦。
举个例子吧,像 Vector,list 啊什么的其实都很简单,最多就多了的同步的声明,其实如果要实现像Vector那种,插入,删除不多的,可以用一个Object table来实现,按索引存取,添加等。
如果插入,删除比较多的,可以建两个Object table,然后每个元素用含有next结构的,一个table存,如果要插入到i,但是i已经有元素,用next连起来,然后size++,并在另一个table记录其位置。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在Java编程语言中,HashMap是Java集合框架的重要组成部分,它提供了高效的存储和检索对象的能力,实现了"键-值"对的映射。本教程将深入分析2022年Java中HashMap的内部机制、关键属性和操作。 HashMap的核心属性包括...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。...通过阅读《数据结构与算法(JAVA语言版)》这本书,你将深入理解这些概念,并能熟练运用Java语言实现它们,从而提升你的编程能力。
本书“数据结构与算法经典问题解析 Java语言描述”深入浅出地探讨了这个主题,旨在帮助读者提升编程技能并增强解决问题的能力。 首先,数据结构是存储和组织数据的方式,它包括数组、链表、栈、队列、树、图、哈希...
《Java深度历险》这本书是Java开发者的一本深入学习指南,它涵盖了Java编程语言的核心概念、高级特性以及实际开发中的应用技巧。通过本书,读者可以系统地了解Java的各个方面,从而提升自己的编程技能和问题解决能力...
3. **自然语言处理(NLP)**:Java NLP库如Stanford CoreNLP或Apache OpenNLP可以帮助处理文本数据,进行词性标注、实体识别、句法分析等。 4. **并发编程**:搜索引擎通常需要处理大量并发请求,Java的并发库如...
本教程由著名计算机教育家李春葆教授提供,主要使用Java语言来描述各种数据结构,结合源码和课件,为学习者提供了一套完整的自学资源。 首先,Java是一种面向对象的编程语言,它具有丰富的类库和强大的功能,适合...
《数据结构与算法分析:Java语言描述》是一本深度探讨数据结构和算法的书籍,尤其注重使用Java语言进行实现。本书旨在帮助读者理解和掌握如何在实际编程中有效地使用数据结构和算法,提升软件开发的效率和质量。...
本资料集是基于Java语言的实现,由著名计算机科学家Mark Allen Weiss所著的《数据结构与问题求解——java语言描述》(第三版)的源码。该书通过丰富的实例和深入的理论讲解,帮助读者理解和掌握各种经典的数据结构...
提供的资源如"Java常见笔试、面试题目深度剖析一(未加密).exe"和"Java常见笔试,面试题目深度剖析.ppt"应包含了对这些知识点的详细解析和实例,对于复习和准备是非常有价值的。建议考生结合这些资料进行系统性学习,...
在本节"Java常见笔试、面试系列...以上就是"Java常见笔试、面试系列深度剖析第3讲"的主要内容,涵盖了Java语言的关键知识点,通过深入学习和理解,不仅可以提升技术水平,也能为求职者在Java相关岗位的竞争中增添优势。
《JAVA2深度历险_简体版》是一本专注于Java编程技术的深度探索书籍,旨在帮助读者深入理解和掌握Java语言的各个方面。这本书以其简体版的形式,相较于繁体版更便于国内读者阅读和理解,降低了学习Java技术的语言障碍...
学习“实用数据结构教程_Java语言描述”这份资料,你将能够深入理解这些数据结构的实现原理,并学会如何在Java程序中应用它们。通过实例和练习,你可以提升解决问题的能力,为成为一名优秀的Java开发者打下坚实基础...
《Java语言程序设计 进阶篇 第十版》是一本深度探索Java编程的权威书籍,其课后习题是学习者巩固理论知识、提升实践能力的重要环节。本资源包含了书中多个章节的习题答案,包括chapter20至chapter34,涵盖了广泛的...
《数据结构与算法经典问题解析 Java语言描述》第二版是一本深入探讨计算机科学核心领域的书籍,专注于使用Java语言来阐述和解决数据结构和算法的问题。这本书面向的是对编程有一定基础,希望通过深入理解数据结构和...
《Java 深度历险》是一本专为Java开发者准备的深度学习书籍,它涵盖了Java...通过《Java 深度历险》,读者不仅能全面了解Java语言的各个方面,还能掌握实际项目开发中的技巧和最佳实践,从而成为一名熟练的Java开发者。
《数据结构与算法分析-java语言描述(第二版)》这本书是专门针对Java语言使用者设计的,旨在深入讲解数据结构和算法的知识,并以Java语言作为实现这些概念的工具。本书不仅适合于计算机科学相关专业的学生,也适合...
总之,Java语言是一门深度和广度兼具的编程语言,从基础到高级,都有丰富的知识点等待探索。自学Java需要耐心和毅力,但只要你按照系统的学习路径,结合实际项目练习,相信你一定能够掌握这门强大的编程语言。
在“深度学习java及其算法详解”这一资源中,我们探讨的是如何将Java编程语言与深度学习技术相结合,以及深入理解基础的计算机科学概念,特别是数据结构和算法。Java是一种广泛应用于企业级应用、移动开发(如...
作者王森,以其丰富的编程经验和深入的理解,为读者揭示了Java语言的精髓与复杂性,帮助程序员从初级阶段跨越到高级开发者水平。 这本书主要涵盖以下几个核心知识点: 1. **Java基础**:包括基本语法、数据类型、...
通过阅读《Java深度历险》,读者不仅可以掌握Java语言的基本知识,还能深入了解其运行机制,提升解决问题的能力,从而在实际开发中更加得心应手。书中的实例和实战指导将使学习过程更为生动和有效。