手动HashMap的简单实现
来源:互联网 发布:微信加粉丝软件 编辑:程序博客网 时间:2024/06/03 20:33
说起HashMap的强大之处,就是其内部使用了哈希算法和链表算法,充分利用好加载因子的强大推动,使得在时间和空间上的成本寻求一种折中,其内部元素在存储和提取不仅可以充分利用好HashMap初始化的空间,而且查询效率及其的高!
在面试中,面试官会常问HashMap的底层源码的实现,接下来我简单的手动实现一个HashMap集合:
(一)HashMap中存储的元素类型即为键值对存在,定义一个能包含键值对的内部类:
class MapEntry {Object key;Object value;public MapEntry(Object key, Object value) {super();this.key = key;this.value = value;}}
(二)我们使用java.util.LinkedList双向链表来模拟HashMap中底层实现的数组(即链表数组)
/** * 1.提高查询的效率 2.默认加载因子 (0.75) 即在时间和空间成本上寻求一种折衷。加载因子过大存储空间能得到充分利用,但查询效率会低一点; * 加载因子过小,存储空间利用率降低,但是查询速度会高一点!(加载因子的设计大小要保证存储空间充分利用,且查询效率高) */public class ManualHashMap {LinkedList[] arr = new LinkedList[999]; // 键值对集合! Map底层结构是:数组 + 链表int size = 0; // HashMap的容量// 构造方法public ManualHashMap() {}/* * 向HashMap中存入键值对 */public void put(Object key, Object value) {MapEntry node = new MapEntry(key, value);/* * 获取该键值对在数组中的索引位置(0~998); * 重写HashCode()方法就是为了让具有相同属性对象具有相同的HashCode值(地址码); * 由于重写HashCode()方法在任何种程度上,都会出现一定的Bug,使得具有不同属性值都会有相同的HashCode码值; * 此时就需要重写equals()方法,进行二次比较key值是否相同,就可做到万无一失了! */int hash = node.key.hashCode() % arr.length;hash = hash < 0 ? -hash : hash;if (arr[hash] == null) { // 此索引位置为空LinkedList<MapEntry> list = new LinkedList<>();//创建一个双向链表arr[hash] = list;list.add(node);size++;} else { // 该位置有元素LinkedList<MapEntry> list = arr[hash]; // 取出该索引处的链表// 判断有没有键值重复boolean flag = false;//判断此链表中,是否存在重复的键值for (int i = 0; i < list.size(); i++) {MapEntry temp = (MapEntry) list.get(i);if (temp.key.equals(key)) { // 键值有重复temp.value = value; // value值覆盖flag = true;}}if(!flag){//不存在重复的key,需添加此元素list.add(node);size++;}}}/* * 获取键值对中某个键值对对象 */public Object get(Object key) {int hash = key.hashCode() % arr.length;hash = hash < 0 ? -hash : hash;if (arr[hash] != null) {LinkedList<MapEntry> list = arr[hash];for (int i = 0; i < list.size(); i++) {MapEntry temp = (MapEntry) list.get(i);if(temp.key.equals(key)){return temp.value;}}}return null;}public static void main(String[] args) {ManualHashMap map = new ManualHashMap();map.put("6", "b");map.put("6", "a");map.put("5", "c");map.put("4", "d");System.out.println(map.size);//3System.out.println(map.get("6"));//a}}
本人只是简单的实现了HashMap存取数据的详细过程,加载因子以及数组的扩容再次赋值,过于繁琐,若需理解深透,请自行查阅HashMap底层的源代码! 阅读全文
0 0
- 手动HashMap的简单实现
- hashmap 的简单实现
- HashMap的简单实现
- 手动实现HashMap
- 简单的hashmap的实现
- java HashMap的简单实现
- 自己手动实现HashMap底层
- 手动实现简单的ArrayList底层
- hashMap的实现原理-自定义简单的hashMap
- 基于HashSet的HashMap的简单实现
- java自己实现的简单的hashMap
- 一个简单的HashMap C语言实现
- 一个简单的HashMap C语言实现
- java:简单聊聊hashMap的实现
- JS中实现简单实用的HashMap
- HashMap的简单实现,具有线程安全
- HashMap实现简单的缓存Cache
- 基于HashMap实现简单的缓存处理
- 那些数据类型导致的坑
- Zookeeper选举过程
- c++继承
- python的for循环和while循环的一些代码
- 战场的数目——湖南省第六届大学生计算机程序设计竞赛
- 手动HashMap的简单实现
- 8皇后
- 【OpenStack源码分析之六】从虚拟机启动流程看安全认证
- 带进度条上传多视频
- hdu2476-区间DP
- 工厂方法模式简单介绍(Java语言)
- 使用PHP二维码生成类库PHP QR Code生成二维码
- leetcode 26. Remove Duplicates from Sorted Array
- <body>标签常用属性