hashmap

造个轮子-HashMap

浪子不回头ぞ 提交于 2019-12-26 13:39:24
造个轮子-HashMap 发现自己对看源码特别痛苦,而且看了就忘。有必要按照源码已有的功能需求按照自己的想法去写一个轮子,然后比对着看才能理解。 需求分析 hashMap 功能很多,结构为数组 链表(暂时忽略红黑树),准备就写两个基本功能: put 存数:懒加载数组,到达阈值(负载因子0.75)扩容,hash冲突开始链表模式。 get 取数:能在hash冲突的情况下取出正确的数。 我就围绕这两个功能来仿照写一个 WheelHashMap 。 开始 新建 WheelHashMap 类 基本属性和 hashMap 保持一致 hash 方法复制 hashMap 的 put 方法 resize 扩容方法 get 方法 总结 在造轮子的过程中体会到为什么数组长度要是2的倍数 通过hash值去计算数组坐标 hash & (length-1) ,一般是通过取余实现,这里用与运算效率比取余高,正是因为2的倍数,才能这样设计。 扩容时对于hash冲突的链表rehash的高低位设计,也是因为2的倍数才能这么巧妙。 代码可以在 Github 上找到 本文来自 chentiefeng的博客 来源: CSDN 作者: 东方茄子_1990 链接: https://blog.csdn.net/chentiefeng/article/details/103712992

HashMap源码记录1|火影凡酷

☆樱花仙子☆ 提交于 2019-12-26 12:07:58
前言:由于笔者所在的公司用的是jdk1.8,故该源码是针对1.8分析的。 首先:我们看一张长的很丑的HashMap的结构图: 再看看几个核心的常量: 复制代码 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认初始化容器大小,当自己指定容器大小时,必须为2的幂次方 static final int MAXIMUM_CAPACITY = 1 << 30; //容器的最大容量值 static final float DEFAULT_LOAD_FACTOR = 0.75f; //加载因子 static final int TREEIFY_THRESHOLD = 8; //把桶中链表转换为红黑树的阈值 static final int UNTREEIFY_THRESHOLD = 6; //把红黑树转换成链表的阈值 static final int MIN_TREEIFY_CAPACITY = 64; //最小的表容量使桶被树化,当表的容量小于该值时,先扩容解决hash冲突而不是树化 复制代码 putVal()方法: 复制代码 1 /** 2 * 实现Map.put和相关方法 3 * 4 * @param hash 根据key计算出来的hash值 5 * @param key 键 6 * @param value 值 7 *

Java面试篇:手撕hashmap与ArrayList,LinkedList。

◇◆丶佛笑我妖孽 提交于 2019-12-26 09:56:26
这两个月来第一次8点下班,没有到12点甚至有点不习惯,马上就要到跳槽旺季,那么我给大家整理一套最常问的几个集合面条题,废话不多说,直接进入正题。 一、HASHMAP 1.如果想要了解hashmap首先要了解其数据结构 ①.hashmap数据结构是什么? hashmap数据结构中有数组和链表来实现对数据的存储 数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1),随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到给定地址的数据,但是插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。所以数组的特点是:寻址容易,插入和删除困难; 链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N),链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难。所以链表的特点是:寻址困难,插入和删除容易。 哈希表:那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。 哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表中的数组“

JDK8源码解析 -- HashMap(二)

半腔热情 提交于 2019-12-26 08:52:57
在上一篇 JDK8源码解析 -- HashMap(一) 的博客中关于HashMap的重要知识点已经讲了差不多了,还有一些内容我会在今天这篇博客中说说,同时我也会把一些我不懂的问题抛出来,希望看到我这篇博客的大神帮忙解答困扰我的问题,让我明白一个所以然来。彼此互相进步,互相成长。HashMap从jdk7到jdk8版本改变大,1.新增加的节点在链表末尾进行添加 2.使用了红黑树。 1. HashMap容量大小求值方法 // 返回2的幂次 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; } (1)为什么这里需要 int n = cap - 1这样呢? 首先我们要明白这个方法的作用是获取输入容量大小最近的2的幂次值。假设你传过来的参数cap是16的话,经过下面的运算得出来的值为32,而不是16。所以这里需要减去一。这样才能获此值最小的2幂次值。 (2)这里左移之和为31=1+2+4+8+16,这里为什么是31呢? 这里容量大小是int的类型

ConcurrentHashMap: how to replace the value of an entry only if the current value is smalle

时光毁灭记忆、已成空白 提交于 2019-12-26 06:49:28
问题 I want to: Add an entry to a ConcurrentHashMap, if there is no entry for the key, or Replace the value for the key, only if the current value is smaller. I came up with the following code, but sine it has while (true), it looks scary to me :) I wanted to check it with you guys. Do you think it is working? // Input: map, k, t while (true) { if (map.containsKey(k)) { current = map.get(k); if (current != null && current < t) { if (map.replace(k, current, t)) break; } else if (current != null &&

ConcurrentHashMap: how to replace the value of an entry only if the current value is smalle

十年热恋 提交于 2019-12-26 06:49:27
问题 I want to: Add an entry to a ConcurrentHashMap, if there is no entry for the key, or Replace the value for the key, only if the current value is smaller. I came up with the following code, but sine it has while (true), it looks scary to me :) I wanted to check it with you guys. Do you think it is working? // Input: map, k, t while (true) { if (map.containsKey(k)) { current = map.get(k); if (current != null && current < t) { if (map.replace(k, current, t)) break; } else if (current != null &&

java知识系列之集合理论篇

杀马特。学长 韩版系。学妹 提交于 2019-12-26 04:55:56
本文主要综合介绍java集合中比较重要的一些概念和实现。如下图 基础部分 Collection List :接口实例存储的是 有序的 , 可以重复 的元素。 ArrayList - 底层使用数组 - 读取速度快,增删速度慢 - 不是线程安全的,只能在单线程环境下,多线程环境下可以考虑用collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发CopyOnWriteArrayList类。 - 当容量不够时,当前容量*1.5+1 LinkedList 底层使用双向链表数据结构 读取速度慢,增删快 线程不安全 implements List, Deque。实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列使用。自然也可以被当作"栈来使用" Vector 底层使用数组 读取速度快,增删慢 线程安全,效率低 容量不够时,默认扩展一倍 Stack Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出 小结 java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链的线性表)是线性表的两种典型实现 Queue代表了队列

浅谈Java中的Hashmap

♀尐吖头ヾ 提交于 2019-12-26 03:13:43
HashMap:    java.lang.Object    ∟ java.util.AbstractMap<K,V>    ∟ java.util.HashMap<K,V>   类型参数:   K - 此映射所维护的键的类型   V - 所映射值的类型   public class HashMap<K,V> extends AbstractMap <K,V> implements Map <K,V>, Cloneable , Serializable    HashMap 是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外, HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 HashTable:      java.lang.Object      ∟java.util.Dictionary<K,V>      ∟java.util.Hashtable<K,V>   类型参数:   K - 此映射所维护的键的类型   V - 所映射值的类型 public class Hashtable<K,V> extends Dictionary <K,V>implements Map <K,V>, Cloneable ,

给HashMap做个深度剖析手术

纵饮孤独 提交于 2019-12-25 22:28:16
人们 对于任何事物的认知,往往都存在这么一个现象:只有你了解的东西,你才会感兴趣。 HashMap 之于 Java 开发者来说,也是如此。相信多数人在起初相当长的时间内,对HashMap的印象都是“Map接口的实现类,是基于哈希的,用于存放键-值对,允许 null 作为键和值,非线程安全的”,仅此而已。于是在程序编写过程中便“肆无忌惮”往里放键-值对。而只有你对 HashMap 的实现有了一定的了解之后,你才会有兴趣研究HashMap深层次的问题,比如“HashMap最多能放多少个键-值对?如何提高HashMap的使用效率?”。其实,我一直都对HashMap的“线性数组+链表”的实现机制充满好奇,刚刚有时间研究了一下源码,现把心得与大家分享。 首先 ,我们来看看HashMap的数据结构: /** * 初始容量,大小必须是2的指数次方,默认是16. */ static final int DEFAULT_INITIAL_CAPACITY = 16; /** * 默认最大容量,值为1<<30 */ static final int MAXIMUM_CAPACITY = 1 << 30; /** * 哈希表的默认加载因子,值为0.75. */ static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * 存储元素的数组,大小必须是2的指数次方

百度大脑之通用文字识别进行图像修复攻略

会有一股神秘感。 提交于 2019-12-25 20:44:51
【通用文字识别另类使用】进行图像修复 作者:756665228 OCR的另类使用。你相信OCR可以进行图片修复吗?不管信不信。反正小帅是这样做了一个案例。 接下来就紧跟步伐看小帅是如何实现这样的功能吧 实现步骤 Step1:成为百度AI开放平台的开发者 我们有账号之后登录,并且点击此处(文字识别)创建一个应用,如下图 然后就能看到创建完的应用和 APPID、API KEY 以及 Secret KEY了 由于图像修复是另一个模块下的接口,为了不创建过多的应用。咱们开发者需要记住APPID。申请加入百度图像识别官方QQ群(群号:659268104),提供公司名称、APPID、应用场景,等待百度工作人员协助开通权限后方可使用。 Step2:准备数据 文字识别服务可以让小帅把自己拍摄的含有文字的图片转化成文本数据,然后就可以对文字进行编辑等操作,咱们需要借助于OCR部分数据进行图片修复。那小帅提前准备的图片如下 Step3: 编写一个文字识别示例程序 有 第一步 的 API KEY 以及 Secret KEY,以及 第二步 的数据,我们就可以写一个示例代码调用百度AI开放平台的文字识别能力 准备开发环境 小帅选择用 Java来快速搭建一个原型,关于如何安装Java。可以参考百度经验哦~。百度AI有很完善的API文档、和封装调用更方便的工具包。接下来小帅就用Maven搭建工程环境 pom