hashmap删除指定key_【金三银四】HashMap图解原理与数据结构

面试被虐

周末你好!我是狮子王辛巴。一名无缘985,日常996工程师。利用周末休息时间给大家献上一篇技术文章。

9261545b6e118de516ebffed4d70e970.png

作为一名为人民币服务的工程师,学好技术是多么重要的事情。今天跟各位老铁们详细说说日常的开发中经常用到的HashMap。7eddc4e0d2b412c60124510bdffd15d5.png

怎么可能骗你,真的哦,无论我们在开发中还是在面试的时候HashMap必问好不好。上次“娜娜”去熊厂 就被面试官问到了,被虐的体无完肤。c5ee9e18c7b8eec88ade5a908dd014b4.png哼~~~哼~~~哼~~~~哼~~~~哼~~~~哼~~哼~~~哼~~~~

娜娜宝贝别生气了,辛巴哥哥现场教学了。首先我们快速回忆下我们日常开发中怎么使用hashmap的。

快速开始

public class App {

public static void main(String[] args) {

//Map map = new HashMap<>();

App map=new App();

map.put("刘一", "刘一");

map.put("陈二", "陈二");

map.put("张三", "张三");

map.put("李四", "李四");

map.put("王五", "王五");

map.put("java_jiagou", "微信搜:java大型网站架构");

System.out.println(map.get("java_jiagou"));

}

hashmap在我们日常工作一般用的多的就是其put方法和get方法。

技术本质

现在我们已经对hashmap有一个大致的了解了,接下来我们要去了解其底层的原理,也就是本质。c06f7b52f4ef552656b2bc321ecbfbe2.png很多朋友在面试的时候经常被问到hashmap底层实现原理?都说是数据+链表 ok!估计大家都会被了 但是真正知道底层如何存储的我相信不多,不急 我们来看下数组和链表的定义

数组

数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);对于一般的插入删除操作, 涉及到数组元素的移动,其平均复杂度也为O(n)

10a6b4ca3bdf1a470ed160a89a626b47.pngJava代码表示

//数组:采用一段连续的存储单元来存储数据。

//特点:指定下标O(1) 删除插入O(N) 数组:查询快 插入慢 ArrayList

public static void main(String[] args) {

Integer[] integers = new Integer[10];

integers[0]=0;//王五

integers[1]=1;

integers[2]=2;

integers[9]=9;

链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1), 而查找操作需要遍历链表逐一进行比对,复杂度为O(n)

7efe38f9738b1e8864599ced7130b856.png

public class Node {

public Node next;

private Object data;

public Node(Object data) {

this.data = data;

}

//链表:链表是一种物理存储单元上非连续、非顺序的存储结构

//特点:插入、删除时间复杂度O(1) 查找遍历时间复杂度0(N) 插入快 查找慢

public static void main(String[] args) {

Node node=new Node(15);

node.next=new Node(1);

node.next.next=new Node(9);

}

哈希算法

哈希算法(也叫散列),就是把任意长度值(Key)通过散列算法变换成固定长度的key地址,通过这个地址进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。7531219b1c79473b9b48ff3071a2557b.png

实现原理PUT

刚才我们分析了hashmap由数组+链表构成,介绍了数组+链表的描述,接下来我们就把这两个数据结构整合在一起吧,在整合在一起 我们写一个伪put代码,目的是看hahsmap底层存储

/***

* 输出 key value hashcode 等 hash算法

* @param key

* @param value

*/

public void put(String key, String value) {

//hash函数

System.out.printf("key:%s,hash值:%s,存储位置:%s\r\n", key, key.hashCode(), Math.abs(key.hashCode() % 15));

}

运行代码如下

key:刘一,hash值:671464,存储位置:4

key:陈二,hash值:1212740,存储位置:5

key:张三,hash值:774889,存储位置:4

key:李四,hash值:842061,存储位置:6

key:王五,hash值:937065,存储位置:0

key:java_jiagou,hash值:1185548040,存储位置:0

对应的图形存储结构就是:

1. 初始化:21211a7a4ed699205f12ed5e7dd7ac09.png**2. 第一次put:

这次put“刘一” 存放在下标为4的数组上,对象类型是

class Entry<K, V>

K k;

V v;

int hash;

Entry<K, V> next;

key:刘一,hash值:671464,存储位置:4

c00a77ca5fb0545f5a32a2822a0c6a7a.png第二次put:这次put“陈二” 存放在下标为5的数组上

key:陈二,hash值:1212740,存储位置:5fab123776c5b82184d8b58acb9f01083.png

第三次put:这次次put“张三” 存放在下标为4的数组上,可是下标为4已经有“刘一”了,如果暴力存储会出问题的呀。别急嘛,我们刚才不是还学了链表嘛。这个时候该链表上场了。

key:张三,hash值:774889,存储位置:4

9f1c53ce1e5f1dfe02bb454ba93c76c0.png

第N次put:我相信通过前几次的put大家都会put了吧,最后存储结构是这样的。b76749d1e6665763aedf1c6f7dba5cc5.png

实现原理GET

我们put是根据hash算法定位到数组下标的,那我们get怎么找到他们了?非常简单嘛原路去找 尽然可以通过hash算法put,肯定也可以通过hash算法get到嘛。A点尽然可以到B点,那自然B点也可以到A点嘛。示范一个,只示范一个。

8b4ca5851f1d6e7789d168bbd16c5065.png

实现

娜娜你听懂了嘛?631207053c6b8ca88dc75e3fa2527da7.png哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!快到碗里来吧

fab927ed4117ba4ea5e031f70163840f.png

总结

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是牛人。那我再布置个作业吧。根据我们图形的演示,你能手写实现吗?

我提示下

public interface Map<K,V> {

public V put(K k,V v);

public V get(K k);

public int size();

interface Entry<K,V>{

public K getKey();

public V getValue();

}

}

需要源代码的牛人欢迎联系我呀。

另外:下篇介绍HashMap jdk1.8关于红黑树这块的知识,我们下篇见。

0df1a15c6aa3432e269171c17d9f34be.png

如果本篇博客有任何错误,请批评指教,不胜感激 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值