根据数组+链表的原理,自己实现一个简易版的HashMap
来源:互联网 发布:天苍苍野茫茫网络歌手 编辑:程序博客网 时间:2024/05/17 02:55
前言
昨天被人问到了HashMap底层实现方式,然而自己却只知道用hashCode()方法实现。虽然有看过HashMap源码,但自己却一直没搞懂具体实现方式。于是,从朋友那里借来一本书,专门研究了一下Map,才发现原来底层实现就是“数组 + 链表”的形式(顿时无语,当时自己居然没看出来!!)。
接上两篇“数组 + 链表”,本次还是尝试自己根据其原理来实现一个简易版的HashMap。
Map简介
- Map底层实现原理
- 数组 里面放 链表, 链表 里面放的Entry(key,value)。
- 大致模型
- 数组{链表1, 链表2, 链表3}
- 链表1(Entry1<—>Entry2<—>Entry3)
- Entry1(key, value)
- 查找value的方式
- 先根据key的hashCode对容器size取余数,找到数组里面的链表对象
- 再遍历链表,根据key找到value(此时是用的key.equals()进行比较)
代码如下
import java.util.LinkedList;/** * 自己实现一个简易版的HashMap * * @author ALion * @version 2017/11/4 16:03 */public class MyHashMap<K, V> { private LinkedList[] arr = new LinkedList[9999]; private int size; public int size() { return size; } /** * 存入一个key-value对 */ public void put(K key, V value) { MyEntry<K, V> entry = new MyEntry<>(key, value); int num = (key.hashCode() & 0x7FFFFFFF) % arr.length;//也可以Math.abs(key.hashCode() % arr.length) if (arr[num] == null) { LinkedList list = new LinkedList(); list.add(entry); arr[num] = list; } else { LinkedList list = arr[num]; for (Object obj : list) { MyEntry e = (MyEntry) obj; if (e.key.equals(key)) { e.value = value; //如果key相同,就覆盖 return; } } arr[num].add(entry); } size++; } /** * 根据key,获取value */ public V get(K key) { int num = (key.hashCode() & 0x7FFFFFFF) % arr.length;//也可以Math.abs(key.hashCode() % arr.length) if (arr[num] != null) { LinkedList list = arr[num]; for (Object obj : list) { MyEntry<K, V> entry = (MyEntry<K, V>) obj; if (entry.key.equals(key)) { return entry.value; } } } return null; } /** * key-value的封装类 */ static class MyEntry<K, V> { K key; V value; MyEntry(K key, V value) { this.key = key; this.value = value; } }}
测试一下
/** * Main * * @author ALion * @version 2017/11/4 16:02 */public class Main { public static void main(String[] args) { MyHashMap<String, String> map = new MyHashMap<>(); map.put("zhangsan", "chongqing"); map.put("lisi", "beijing"); map.put("wangwu", "shanghai"); System.out.println(map.get("lisi")); MyHashMap<String, Integer> map2 = new MyHashMap<>(); map2.put("zhangsan", 18); map2.put("lisi", 26); map2.put("lisi", 28); System.out.println(map2.get("lisi")); System.out.println(map2.size()); }}
阅读全文
0 0
- 根据数组+链表的原理,自己实现一个简易版的HashMap
- 根据数组的原理,自己实现一个简易版的ArrayList
- 根据链表的原理,自己实现一个简易版的LinkedList
- 【java集合】自己实现简易的HashMap
- 自己实现一个简单版的HashMap
- 一个简易的HashMap
- 自己实现简易HashMap
- 【java集合】自己实现简易的HashMap~改良
- 自己实现一个简易的SpringMVC
- 实现自己的HashMap
- 实现自己的HashMap
- 自己实现的hashmap
- HashMap的实现原理
- HashMap的实现原理
- hashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- 第十周作业:上机练习题--异常处理
- Add Two Numbers我见过的最简洁的C++实现之我的第一篇博客
- python单例设计模式简述
- 【Android】【Network】Android 网络
- Leetcode 算法题06
- 根据数组+链表的原理,自己实现一个简易版的HashMap
- 大数据竞赛平台——Kaggle 入门篇
- Spring与Hibernate整合之sessionFactory创建出错
- IntelliJ IDEA 2017.2.5 x64中的Spring Initializr来快速构建Spring Boot/Cloud工程
- 磁盘的管理
- 数据库笔记4————关系数据库标准语言SQL中(SQL的数据查询)
- java数组
- P2p二维码
- java集合框架的练习之TreeSet集合与ArrayList集合的混合使用