简单易懂的HashMap使用指南:从入门到精通

HashMap的用法 HashMap是 Java 中的一个非常重要的集合类,它实现了Map接口。HashMap存储键值对(key-value pairs),其中每个键都是唯一的,并且映射到最多一个值。HashMap允许使用null值和null键,但需要注意的是,HashMap最多只能有一个null键。 阅读详情

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

  如下是Java集合体系架构图,近期几期内容都是围绕该体系进行知识讲解,以便于同学们学习Java集合篇知识能够系统化而不零散。

前言

  在Java中,HashMap是一种重要的数据结构,也是我们经常使用的一种存储数据的容器。但是,你是否了解HashMap的具体实现?在使用HashMap时,你是否遇到过问题或者疑惑?在本文中,我们将通过源代码解析、应用场景案例、优缺点分析等方面,深入了解HashMap这个精妙的数据结构。

摘要

本文将从以下几个方面对Java中的HashMap进行分析:

  1. 源代码解析:对HashMap的源代码进行解析,了解HashMap的具体实现;
  2. 应用场景案例:通过具体场景案例,让读者了解在实际开发中如何灵活运用HashMap;
  3. 优缺点分析:对HashMap的优缺点进行分析,帮助读者更好地掌握HashMap的适用范围;
  4. 类代码方法介绍:对HashMap中各个方法的使用方法和注意事项进行详细介绍;
  5. 测试用例:提供相关测试用例,帮助读者更好地理解HashMap的应用。

HashMap

简介

  HashMap是一种常见的键值对存储容器,其内部采用散列表实现,可以快速地查找键对应的值。具体来说,HashMap内部维护了一个Entry数组,每个Entry包含了一个键值对。HashMap使用哈希算法将键值对映射到数组中的位置,从而实现快速查找。

  在Java中,HashMap继承自AbstractMap类,实现了Map接口,提供了一系列的方法用于操作键值对。

源代码解析

  为了更好地理解HashMap的实现,我们将对其源代码进行解析。

数据结构

  HashMap内部维护了一个Entry数组,每个Entry包含了一个键值对,定义如下:

java

复制代码

static class Entry implements Map.Entry { final K key; V value; Entry next; final int hash; // ... }

  其中,key表示键,value表示值,next表示下一个节点,hash表示键的哈希值。

插入操作

HashMap中插入一个键值对的操作可以通过以下代码实现:

java

复制代码

public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }

  其中,inflateTable用于初始化Entry数组,如果Entry数组未被初始化,则调用inflateTable方法进行初始化。putForNullKey用于处理键为null的情况。hash方法用于计算键的哈希值。indexFor方法用于将哈希值映射到Entry数组的位置。for循环用于查找键是否已经存在于Entry数组中。如果键已经存在,则更新值;否则,添加新的Entry。

查找操作

HashMap中查找某个键的值的操作可以通过以下代码实现:

java

复制代码

public V get(Object key) { if (key == null) return getForNullKey(); Entry entry = getEntry(key); return null == entry ? null : entry.getValue(); } final Entry getEntry(Object key) { int hash = (key == null) ? 0 : 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; }

  其中,get方法用于获取指定键的值,如果键不存在,则返回null。getEntry方法用于查找对应的Entry。

删除操作

HashMap中删除某个键值对的操作可以通过以下代码实现:

java

复制代码

public V remove(Object key) { Entry e = removeEntryForKey(key); return (e == null ? null : e.value); } final Entry removeEntryForKey(Object key) { int hash = (key == null) ? 0 : hash(key); int i = indexFor(hash, table.length); Entry prev = table[i]; Entry e = prev; while (e != null) { Entry next = e.next; Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { modCount++; size--; if (prev == e) table[i] = next; else prev.next = next; e.recordRemoval(this); return e; } prev = e; e = next; } return e; }

  其中,remove方法用于删除指定键值对,先调用removeEntryForKey方法查找对应的Entry。如果找到对应的Entry,则将其删除;否则,不做任何操作。

应用场景案例

HashMap可以用于存储键值对,适用于如下场景:

  1. 对象属性存储和查找;
  2. 缓存实现;
  3. 计数器实现。

下面以缓存实现为例,介绍HashMap的应用:

java

复制代码

public class Cache { private Map cache = new HashMap<>(); public void put(String key, Object value) { cache.put(key, value); } public Object get(String key) { return cache.get(key); } public void remove(String key) { cache.remove(key); } public void clear() { cache.clear(); } public int size() { return cache.size(); } public boolean containsKey(String key) { return cache.containsKey(key); } public boolean containsValue(Object value) { return cache.containsValue(value); } }

  在上述代码中,我们利用了HashMap实现了一个简单的缓存,用户可以通过put、get、remove、clear等方法来操作缓存中的对象,方便地实现了对象缓存的功能。

优缺点分析

优点

  1. 快速查找:由于HashMap采用哈希算法实现,可以快速地查找指定键对应的值;
  2. 高效存储:HashMap内部采用数组实现,可以高效地存储大量键值对;
  3. 线程不安全:HashMap在多线程环境下是不安全的,需要手动加锁保证线程安全;
  4. 可适应扩容: HashMap在添加元素过程中,当元素个数达到临界值时,会自动对数组进行扩容,保证可容纳更多元素;

缺点

  1. 内存占用:HashMap内部维护了一个数组,如果数组过大则会占用大量的内存;
  2. 不可保证顺序:HashMap内部使用哈希算法存储,因此键值对的顺序不可预测。

在实际应用中,需要根据具体情况来选择使用HashMap还是其他的容器。

类代码方法介绍

构造方法

java

复制代码

public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted } public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0 throw new illegalargumentexceptionillegal initial capacity: initialcapacity if initialcapacity> MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); } public HashMap(Map m) { this.loadFactor = DEFAULT_LOAD_FACTOR; putMapEntries(m, false); }

  其中,第一个构造方法创建了默认大小的HashMap,第二个构造方法指定了HashMap的初始容量,第三个构造方法同时指定了初始容量和负载因子,第四个构造方法根据给定的Map创建了一个新的HashMap对象。

put方法

java

复制代码

public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node[] tab; Node p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { Node e; K k; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; else if (p instanceof TreeNode) e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value); else { for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }

  其中,put方法用于向HashMap中添加新的键值对,putVal方法是实际的插入操作。如果当前HashMap中的数组为空,则进行初始化;否则,根据键的哈希值计算出要插入的位置。如果该位置已经有Entry,则遍历整个链表,直到找到该键的Entry,然后更新其值;如果整个链表中不存在该键的Entry,则新建一个Entry并插入到链表头部。如果数组中该位置上的链表长度大于等于阈值,则将链表转化为红黑树。

get方法

java

复制代码

public V get(Object key) { Node e; return (e = getNode(hash(key), key)) == null ? null : e.value; } final Node getNode(int hash, Object key) { Node[] tab; Node first, e; int n; K k; if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) { if (first.hash == hash && // always check first node ((k = first.key) == key || (key != null && key.equals(k)))) return first; if ((e = first.next) != null) { if (first instanceof TreeNode) return ((TreeNode)first).getTreeNode(hash, key); do { if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } while ((e = e.next) != null); } } return null; }

  其中,get方法用于获取指定键对应的值,getNode方法用于查找对应的Entry。如果数组中该位置上的Entry不为空,则遍历整个链表或红黑树,直到找到该键的Entry。

remove方法

java

复制代码

public V remove(Object key) { Node e; return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value; } final Node removeNode(int hash, Object key, Object value, boolean matchValue, boolean movable) { Node[] tab; Node p; int n, index; if ((tab = table) != null && (n = tab.length) > 0 && (p = tab[index = (n - 1) & hash]) != null) { Node node = null, e; K k; V v; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) node = p; else if ((e = p.next) != null) { if (p instanceof TreeNode) node = ((TreeNode)p).getTreeNode(hash, key); else { do { if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { node = e; break; } p = e; } while ((e = e.next) != null); } } if (node != null && (!matchValue || (v = node.value) == value || (value != null && value.equals(v)))) { if (node instanceof TreeNode) ((TreeNode)node).removeTreeNode(this, tab, movable); else if (node == p) tab[index] = node.next; else p.next = node.next; ++modCount; --size; afterNodeRemoval(node); return node; } } return null; }

  其中,remove方法用于删除指定键值对,removeNode方法为实际的删除操作。如果数组中该位置上的Entry不为空,则遍历整个链表或红黑树,找到该键的Entry,并删除之。

其他方法

  HashMap还提供了一些其他的方法,如size、isEmpty、containsKey、containsValue、clear等,这些方法都是用于操作HashMap中的键值对。

测试用例

  为了更好地理解HashMap的应用,我们提供了如下的测试用例,读者可以通过测试用例加深对HashMap的应用和实现的理解:

测试代码演示

java

复制代码

package com.example.javase.collection; import java.util.HashMap; import java.util.Map; /** * @Author ms * @Date 2023-10-22 19:47 */ public class HashMapTest { public static void main(String[] args) { Map map = new HashMap<>(); // test put() and get() map.put("a", 1); map.put("b", 2); map.put("c", 3); System.out.println(map.get("a")); // output: 1 System.out.println(map.get("b")); // output: 2 System.out.println(map.get("c")); // output: 3 // test replace() map.put("a", 4); System.out.println(map.get("a")); // output: 4 // test remove() map.remove("a"); System.out.println(map.get("a")); // output: null // test clear() map.put("a", 1); map.put("b", 2); map.put("c", 3); map.clear(); System.out.println(map.size()); // output: 0 // test contains() map.put("a", 1); map.put("b", 2); map.put("c", 3); System.out.println(map.containsKey("a")); // output: true System.out.println(map.containsValue(2)); // output: true System.out.println(map.containsKey("d")); // output: false System.out.println(map.containsValue(4)); // output: false } }

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  如上测试用例演示了如何使用 Java 中的 HashMap 类。首先,代码创建了一个空的 HashMap 对象,并使用 put() 方法添加了三个键值对。然后,代码使用 get() 方法获取这些键对应的值,并使用 replace() 方法替换掉其中一个键的值。接着,代码使用 remove() 方法删除了一个键值对,并使用 clear() 方法清空了整个 HashMap。最后,代码使用 containsKey()和 containsValue() 方法测试是否包含某个键或值。

小结

  HashMap是Java中一个重要的数据结构,内部维护了一个Entry数组,使用哈希算法将键值对映射到数组中的位置,实现快速查找。在实际开发中,HashMap可以用于存储对象属性、实现缓存、实现计数器等。HashMap的优点包括快速查找、高效存储、可适应扩容;缺点包括内存占用、不可保证顺序、线程不安全等。在使用时需要根据具体情况进行选择。

总结

  通过本文的阐述,我们了解了HashMap在Java中的实现和应用场景,深入了解了其数据结构、源代码实现、方法介绍和优缺点分析。同时,我们也提供了相关测试用例,希望读者能够通过实践更好地理解HashMap的应用。对于Java程序员而言,掌握HashMap的使用和内部实现是非常重要的,可以在实际开发中发挥重要作用。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

Java中简单易懂的HashMap面试题(面试必备) 这篇文章仅限小编个人的理解,小编不是Java方向的,只是对Java有很高的学习兴趣 如果有什么不对的地方还望大佬指点 HashMap的底层是数组+链表,(很多人应该都知道了) JDK1.7的是数组+链表 (1.7只是一个例子,以前的话也是这样后面就以1.7为例子了) 首先是一个数组,然后数组的类型是链表 元素是头插法 JDK1.8的是数组+链表 或者 数组+红黑树 首先是一个数组,然后数组的类型是链表 在链表的元素大于8的时候,会变成红黑树 在红黑树的元素小于6的时候会变成链表 元素进行尾插 HaspM. 阅读详情

相关推荐

通俗易懂Hashmap源码解析

Hashmap源码解析 一、Hashmap数据结构 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。 比如上图中,一共有13个桶0-12,当哈希值是01时,就会被放到1桶中,如果是14,对13取模之后也是1,所以也会被放到1桶中。由于1桶有两个数据,就会形成一个链表。 这里需要注意的是,如果链表大小超

xadasss的博客 7939

HashMap的使用方法详解

HashMap是一种十分常用的数据结构对象,可以保存键值对,下面将详细介绍HashMap的使用方法。 一、添加方法 put方法,可以单次向HashMap中添加一个键值对。 注意:添加到Map中的数据,与List不一样,是没有顺序的。顺序是根据哈希算法得出的,不用深究。 putAll方法,可以把一个HashMap集合对象,整体加入到另外一个HashMap对象中。 注意:两个集合中重复的元素,会被覆盖为新的值。 END 二、删除方法 remove方法,可以单次

sanmi8276的博客 3万+

HashMap的实现原理看这篇就够了,图文源码详解,深入浅出简单易懂

HashMap 是一线资深 java工程师必须要精通的集合容器,它的重要性几乎等同于Volatile在并发编程的重要性(可见性与有序性)。本文通过图文源码详解,深度剖析了HashMap的重要内核知识,易看易学易懂,建议收藏阅读,多学一点总是好的,万一面试问到了呢。

mikechen的互联网架构 883

HashMap的基础使用方法

文章目录一、HashMap的结构二、HashMap的继承类三、Key和Value类型设定四、常规使用方法五、获取key或者value集合 一、HashMap的结构 HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改,它存储的内容是键值对(key-value)映射。 二、HashMap的继承类 三、Key和Value类型设定 HashMap 的 key 与 value 类型可以相同也可以不同。 可以是字符串(String)类型的 key 和 value,也

lswMasic的博客 5134

自己实现一个简单的hashMap

我们经常使用hashmap,但是hashMap底层实现到底是怎么实现的呢?你知道么? HashMap的实现原理: 1,利用key的hashCode重新计算出当前对象在数组中的下标 2,存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,覆盖原始值;(2)如果key不同(出现冲突),则将当前key-value放入链表中 3,获取值时,直接找到对应hash值对应的下标,再进行...

一岑的博客 1427

2025年(第十一届)全国大学生统计建模大赛论文及选题分析

基于数据驱动决策:整个研究围绕给定的洪水灾害相关数据进行深入挖掘和分析,从数据清洗、特征分析、模型建立到最终预测,每一步都以数据为基础,通过对数据的有效利用来揭示洪水灾害发生的相关规律和特征,为洪水灾害的风险评估和预测提供依据,符合数据引领未来决策的理念。实际应用导向:洪水灾害是现实中严重影响人类生命财产安全和社会经济发展的重要问题,本研究旨在实现对洪水灾害的预测,其成果可直接应用于防洪减灾工作,如洪水预警、风险评估与区划等,对实际防灾减灾工作具有重要的指导意义,体现了以数据为支撑服务实际应用的特点。

qq_52590045的博客 1万+

HashMap入门

HashMap集合介绍 HashMap是基于哈希表的Map接口实现,是以Key-Value存储形式存在的,主要是键值对。 对于hash冲突的解决方案 1.8之前 1.8 之前哈希Map是一个数组,计算哈希值之后按照取模运算之后放位置,但是如果位置已经被占用了,那么就会在数组下标的地方变为一个链表,利用链表进行存储。 1.8之后 1.8 之后哈希Map也还是一个数组,并且对于哈希冲突也是用链表,但是如果链表长度大于8并且整个数组大于了64的话,那么就会把数组下标位置的链表变为红黑树,因为红黑树的查找效率比

cuitldlsn的博客 774

Android TV开发:RecyclerView焦点控制实践与优化

在Android TV应用开发中,焦点控制是提升用户体验的关键技术。不同于移动端触摸交互,TV端通过遥控器方向键导航,需要精确的焦点管理机制。RecyclerView作为动态列表的核心组件,其焦点控制涉及视图复用、导航逻辑和视觉反馈等核心技术点。通过合理配置focusable属性、自定义焦点查找算法以及优化动画性能,开发者可以解决TV端常见的焦点跳转异常、视觉反馈延迟等问题。特别是在视频点播、智能家居控制等场景中,良好的焦点控制能显著提升操作效率。本文结合网格布局焦点环绕、分页加载焦点保持等实战案例,深入解

weixin_34195142的博客 469

HashMap的工作原理(图文+例子)详解,绝对简单通俗易懂

什么是HashMap? 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与Hashtable大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比...

Huang405267467的博客 1万+

【Ultrascale+ MPSOC学习记录】6、从eMMC启动翻车

因为MPSOC还有一种启动模式是eMMC,接下来咱就实现从eMMC启动。

ryo891012的博客 474

7 series FPGAs Transceiver Wizard IP核使用和测试

学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP...

qq_39921762的博客 1万+

Java-通俗易懂地理解HashMap的原理

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 一、HashMap的节点 HashMap是一个集合,键值对的集合,源码中每个节点用Node<K,V>表示。 static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key;

了解➔熟悉➔掌握➔精通 2万+

1998年高教社杯全国大学生数学建模竞赛 B 题:《灾情巡视路线》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 883

HashMap底层原理(图文并茂,简单易懂)

大家先看下这张图片: 1、HashMap是基于哈希表实现的,而哈希表的底层是数组加上链表的形式。 2、哈希表的默认长度是16,编号从0开始。图中编号0-4的长方形代表了一个数组,箭头指向的代表了一个一个的链表。 3、数组内存连续查询效率高,链表内存分散增删改效率高,哈希表采用此种存储数据的形式极大的提高操作数据的效率。 4、用HashMap存储数据时哈希表会先将HashMap的key通过hashCode计算出该数据在哈希表上的的存储位置。如果该位置没有数据,则直接存储,如果该位置有数据,则与该位置的其它数

C2667378040的博客 1万+

CondaHTTPError: HTTP 404 not found for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs解决方案

本文主要介绍了CondaHTTPError: HTTP 404 not found for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 17万+

ZYNQ PS-PL数据交互方式总结

一,中断 二,IO方式:MIO EMIO GPIO 三,BRAM或FIFO或EMIF (1)通过BRAM实现PL/PS之间交互 PS 的配置如下图所示。使能 M_AXI_GP0 口,将 FCLK_CLK0 设为 100MHz,使能 PL 至 PS 的中断。 AXI BRAM Controller IP 核连接 PS 的 M_AXI_GP0 口和 BRAM,完成 AXI 接口至 BRAM 接口的转换。 添加BRAM,将BRAM设置为双口RAM,将PORTA与AXI B...

wangjie36的博客 1万+

通俗易懂解释Java8 HashMap

Java 8 HashMap 原理解析 HashMap 是 Java 中基于哈希表的键值对集合,采用数组+链表+红黑树结构存储数据。核心原理如下: 存储结构 数组(桶)存储节点,每个位置可挂载链表或红黑树(冲突时)。 当链表长度>8且数组长度≥64时,链表转为红黑树以提升查询效率(O(n)→O(log n))。 哈希计算 通过扰动函数(hashCode ^ (hashCode >>> 16))混合高低位,减少哈希冲突。 数组下标计算:hash & (table.length

weixin_45653328的博客111 1260

鸿蒙接入微信支付 微信H5网页在鸿蒙系统的适配方法(含支付兼容方案) 微信H5适配鸿蒙系统 | ArkWeb识别 | 鸿蒙浏览器UA | 微信支付鸿蒙适配 | 鸿蒙微信判断方式

微信H5网页鸿蒙系统适配指南 针对微信H5网页在鸿蒙系统出现的兼容问题,本文提供完整适配方案。关键点包括: 环境识别:

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1300

通俗易懂的HashMap

哈希表数组位置为下索引为null,我们就直接添加到该索引下就行。哈希表数组位置为下索引不为null,也就是意味着有旧的Node在该位置上。这时候旧Node无非 是链表或者红黑树。如果key不一样,挂在下面形成链表或者红黑树。如果key一样,就直接替换value。到这么差不多了,那我们上面的答案,就显而易见了zhangsan还是那个初始的zhangsan,地址值不变,value变了。

2301_78976656的博客 998

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Parallel Hashmap最佳实践:从入门到精通的15个要点

Parallel Hashmap是一个仅包含头文件的高性能哈希容器库,提供了快速且内存友好的哈希表和B树容器。本文将分享15个实用要点,帮助你从入门到精通这个强大的C++工具库,提升程序性能和内存效率。 ## 1. 快速入门:了解Parallel Hashmap的核心优势 Parallel Hashmap的核心优势在于其并行处理能力和高效的内存使用。作为一个纯头文件库,它无需编译链接,只需包含

gitblog_01152的博客 767

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

HashMap面试题简单易懂

HashMap面试题 1. 谈一下HashMap的特性? 1.HashMap存储(k,v)键值对实现快速存取,key值不可重复,若key值重复就会覆盖,允许key值为null。 2.HashMap底层结构是数组+链表+红黑树,HashMap中的元素是无序的。 3.是非同步,非线程安全。 为什么HashMap中的put()是非线程安全的? 1.主要由于并发扩容引起。java7中每次扩容会变成原来...

松鼠教授的博客 843

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

简单谈谈HashMap

简单谈谈HashMap 文章目录简单谈谈HashMap前言hash算法常用的哈希算法hashmap的数据结构jdk1.7和jdk1.8的区别简单讲解过程1.8之后为什么要引入红黑树?什么时候扩容?扩容源码高频集合扩容的信息什么时候转红黑树?HashMap 中 hash 函数是怎么实现的?还有哪些hash函数的实现方式?当两个对象的 hashCode 相等时会怎么样?什么是哈希碰撞,如何解决哈希碰撞?如果两个键的 hashCode 相同,如何存储键值对?HashMap集合类的成员1.序列化版本号2.集合的初始

if's Blog 2539

Java面试必备:通俗易懂的搞定HashMap源码

前言 最沉稳知礼平生最恨是邪途,即一字情行世间不寂,利不要面试时不要临时抱佛脚,本觉 网易Java社招面试经历分享 一面: 1、简单介绍一下自己。 2、介绍一下你的项目经历。 3、讲一下你在这个项目中用到的技术,负责哪个模块? 4、在项目过程中有没有遇到什么困难,怎么去解决的? 5、Spring具有什么特点(IOC和AOP) 6、HashMap和HashSet的实现原理。 7、动态代理的原理。 8、java虚拟机类加载机制。 9、java虚拟机GC算法。 10、包装类型和基本类型的比较问题。 11、Inte

weixin_47955802的博客 2341
上一篇: 由三个感叹号开启的 Debug 篇章?
下一篇: 关于RocketMQ的高性能设计,你真的了解吗?
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值