1.前言。
如题。
2.详述。
(1)hashMap算法就是数组链表。数组存放的元素是键值对。jdk通过移位算法(其实也就是简单的加乘算法),如下代码来生成数组下标(生成后indexFor一下就成下标了)。
static int hash(int h)
{
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
(2)hashMap的键值对存放的位置和key的值无必然联系,是通过简单的与操作来获得数组下标的。
如:
static int indexFor(int h, int length)
{
return h & (length-1);
}
(3)hashmap的负载因子默认是0.75,
增大和减少无任何意义,jdk对于这个东西的介绍已经很过时了。超过0.75就变为两倍的容量,
自动扩容无任何意义,因为存储的数据大小是受磁盘和内存限制的。通常是程序自动限制个上限就可以了。
3.一句话概括jdk的hashmap实现
就是一个数组加链表,数组里面存放键值对的链表(链表里面放Entry),一般链表只有一个key的元素。如果有key一样的情况,那么put会将其添加到链表里面,此时链表有多个值。
如:
public V put(K key, V value)
{
// 如果 key 为 null,调用 putForNullKey 方法进行处理
if (key == null)
return putForNullKey(value);
// 根据 key 的 keyCode 计算 Hash 值
int hash = hash(key.hashCode());
// 搜索指定 hash 值在对应 table 中的索引
int i = indexFor(hash, table.length);
// 如果 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元素的下一个元素
for (Entry<K,V> e = table[i]; e != null; e = e.next)
{
Object k;
// 找到指定 key 与需要放入的 key 相等(hash 值相同
// 通过 equals 比较放回 true)
if (e.hash == hash && ((k = e.key) == key
|| key.equals(k)))
{
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
// 如果 i 索引处的 Entry 为 null,表明此处还没有 Entry
modCount++;
// 将 key、value 添加到 i 索引处
addEntry(hash, key, value, i);
return null;
}
4.注意事项。
hashmap不能避免hash冲突,只是简单校验,所以经常要重写对象的equals方法。 hashmap可能会淘汰,应该有唯一性算法替代hash算法(如hadoop自定义的序列,我自己也可以开发对应的序列,大数据情况下散列不再重要),算法效率当今已经不是个问题。
分享到:
相关推荐
java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...
jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...
jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...
jdk-11版本安装包、jdk-11版本安装包、jdk-11版本安装包 jdk-11版本安装包、jdk-11版本安装包、jdk-11版本安装包 jdk-11版本安装包、jdk-11版本安装包、jdk-11版本安装包 jdk-11版本安装包、jdk-11版本安装包、jdk-...
bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-...
jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...
开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...
jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-...
标题中的“UOS服务器版MIPS架构龙芯openjdk-8-jdk-mips.tar.gz”指的是一款专为UOS(Unity Operating System)服务器版本设计的、基于MIPS架构的龙芯处理器优化的OpenJDK 8 JDK软件包。UOS是中国自主研发的操作系统...
标题中的"bcmail-jdk15on-1.58"、"bcprov-jdk15on-1.58"以及"bcpkix-jdk15on-1.58"是三个重要的Java库文件,它们属于Bouncy Castle项目的一部分。Bouncy Castle是一个广泛使用的开源密码学API,它提供了大量的加密...
jdk-8版本安装包、 jdk-8版本安装包、 jdk-8版本安装包 jdk-8版本安装包、 jdk-8版本安装包、 jdk-8版本安装包 jdk-8版本安装包、 jdk-8版本安装包、 jdk-8版本安装包 jdk-8版本安装包、 jdk-8版本安装包、 jdk-8...
jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows...
jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586...
标题中的"bcprov-ext-jdk15on-152"和"bcprov-jdk15on-152"是两个与Bouncy Castle库相关的Java档案文件,它们主要用于提供加密和安全服务。Bouncy Castle是一个开源的Java安全提供者,广泛用于密码学应用,包括加密、...
jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586
总的来说,bcprov-jdk15on和bcprov-ext-jdk15on为Java开发者提供了强大的加密工具箱,使得在Java平台上实现安全功能变得更加简单。正确理解和使用这两个库,将有助于提升项目的安全性,保护用户的隐私信息,同时降低...
aspose-words-19.3-jdk17aspose-words-19.3-jdk17aspose-words-19.3-jdk17aspose-words-19.3-jdk17aspose-words-19.3-jdk17aspose-words-19.3-jdk17aspose-words-19.3-jdk17aspose-words-19.3-jdk17aspose-words-...
解决no such provider: BC 问题所需的JAR 在jdk中的jre\lib\security修改java.security文件, security.provider.6=com.sun.security.sasl.Provider 下面添加...bcprov-jdk16-143.jar提供加密,解密,生成密钥对等方法
Bouncy Castle是一个开源的Java加密库,它提供了丰富的加密算法和协议实现,包括对称加密、非对称加密、哈希函数、消息认证码(MAC)、数字签名、密钥管理以及PKCS#7、PKCS#12、OpenSSL格式的支持。此外,它还支持...
2.将下载的两个JAR文件复制到:JDK安装目录\jre\lib\ext下,例如我的就是D:\Program Files (x86)\java\JDK1.6\jre\lib\ext 3.打开java.security文件:在JDK安装目录\jre\lib\security下的java.security文件。