hashmap-请教HashMap源码中的一些问题

问题描述

请教HashMap源码中的一些问题
final Entry getEntry(Object key) {
// 获取哈希值
// HashMap将“key为null”的元素存储在table[0]位置,“key不为null”的则调用hash()计算哈希值
int hash = (key == null) ? 0 : hash(key.hashCode());
// 在“该hash值对应的链表”上查找“键值等于key”的元素
for (Entry e = table[indexFor(hash table.length)];
e != null;
e = e.next) {
Object k;
if (**e.hash == hash **&&
((k = e.key) == key || (key != null&& key.equals(k))))
return e;
}
return null;
}
getEntry()函数中: 为啥要判断hash值是否相等,是因为key相等,hash值不一定相等吗?

public boolean containsValue(Object value) {
// 若“value为null”,则调用containsNullValue()查找
if (value == null)
return containsNullValue();

// 若“value不为null”,则查找HashMap中是否有值为value的节点。**Entry[] tab = table;**for (int i = 0; i < tab.length ; i++)    for (Entry e = tab[i] ; e != null ; e = e.next)        if (value.equals(e.value))            return true;return false;

}
containsValue()中:Entry[] tab = table 为什么要创建一个新的tab引用指向原table,为什么不对table操作呢?
请教各位~

解决方案

hash的优势就在这里,hash相等,不一定值相等,但是hash不等,值一定不相等,基于此,先判断hash,可以加快搜索的速度。
Entry[] tab = table; 这里传的是引用,只是定义了一个类型而已,没有调用new,没有创建新的 tab。这么写只是使得下面需要写table的地方少写3个字母,没有性能的损失,也不是必须的。

时间: 2024-10-03 05:03:39

hashmap-请教HashMap源码中的一些问题的相关文章

Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMap数据结构第3部分 HashMap源码解析(基于JDK1.6.0_45)    第3.1部分 HashMap的"拉链法"相关内容    第3.2部分 HashMap的构造函数    第3.3部分 HashMap的主要对外接口    第3.4部分 HashMap实现的Cloneable接口 

《Android 源码设计模式解析与实战》——第2章,第2.7节Android源码中的单例模式

2.7 Android源码中的单例模式在Android系统中,我们经常会通过Context获取系统级别的服务,如WindowsManagerService.ActivityManagerService等,更常用的是一个LayoutInflater的类,这些服务会在合适的时候以单例的形式注册在系统中,在我们需要的时候就通过Context的getSystemService(String name)获取.我们以LayoutInflater为例来说明,平时我们使用LayoutInflater较为常见的地

关于hadoop 2.6源码中ApplicationClientProtocol的问题

问题描述 关于hadoop 2.6源码中ApplicationClientProtocol的问题 请教大神一个问题 Hadoop 2.6中,Client端提交JOB到RM端,他们是通过ApplicationClientProtocol通信的. 在RM端有RMClientService.java作为服务端接收请求并相应,代码是rpc.getServer(ApplicationClientProtocol.class...),可以看出服务端对应的协议是ApplicationClientProtoco

算法-linux源码中是否支持wfq

问题描述 linux源码中是否支持wfq 请教诸位:Linux源码中是否支持wfq(加权公平队列,实现qos的一种队列调度算法)? 如果支持,在哪个版本支持? 请指点,谢谢! 解决方案 http://download.csdn.net/download/wanghl1010/1481993

PHP实现html源码中回车换行输出

 在源码中输入换行但是不显示像br 之类的字符我们需要通过php地转义字符来实现了,下文就一起来看看吧.     知识扩充   转移序列 说明 n 换行 r 回车 t 水平制表符 [/td> 反斜线 $ 美元符号 " 双引号 [0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符 x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符   用双引号(")定义字符串,PHP 懂得更多特殊字符的转义序列: PHP默认页面编码为HTML,要使

android源码中的values-sw580的文件夹

问题描述 android源码中的values-sw580的文件夹 在看android联系人的源码时发现有values-sw580这样的文件夹,不知道这样的文件夹是干嘛的?还有这个文件夹的名字是如何来定义的? 解决方案 res/下文件夹的命名是这样的,名称分为两部分{作用}[-{适用条件}*]如:values/values-land/values-sw600dp/values-sw600dp-land/等, LZ看到的values-sw580dp这个文件夹,首先它里面放的是value,其实,它只有

android 源码中使用System.loadLibrary加载第三方库

问题描述 android 源码中使用System.loadLibrary加载第三方库 我在android源码中编译一个apk,使用了几个第三方库文件,下面是Android.mk文件内容: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := debug optional eng LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE

simpletree-SimpleTree源码中的展开节点方法,不知道怎么展开到指定的节点,请前段大神指教

问题描述 SimpleTree源码中的展开节点方法,不知道怎么展开到指定的节点,请前段大神指教 我现在要做的是在刷新组织树时,展开到指定的节点,我传了一个pnode(组织树中 的ID),但是不知道展开节点的方法是哪个,不知道在哪里做判断停止展开节点.下面是SimpleTree的js代码. 解决方案 下面是SimpleTree 的JS代码 /* jQuery SimpleTree Drag&Drop plugin Update on 22th May 2008 Version 0.3 * Lice

extjs4-关于 Extjs 4.X中 Ext.Function源码中的一些问题, 关于javascript基础知识的

问题描述 关于 Extjs 4.X中 Ext.Function源码中的一些问题, 关于javascript基础知识的 Ext.Function中定义了如下一个叫做flexSetter的函数,其作用看看就明白 问题在于 其中做a===null判断的地方为什么不用a==null呢? 源码如下: Ext.Function = { /** * A very commonly used method throughout the framework. It acts as a wrapper around