HashMap的简单实现
基本概念
Map 别名映射表,也叫关联数组,基本思想是它维护的键-值(对)关联,因此可以用键查找值,也有放入键值的操作,下面根据定义自己来实现一个Map,首先应该想到的是数组,因为大多数Java集合类底层都是基于数组和链表的,这里我给它命名叫做 MapVersion01
public class MapVersion01<K,V> {
//存储每一个键值对的数组
private Object[][] pairs;
//数组的容量
private int index;
public MapVersion01(int capacity) {
this.pairs = new Object[capacity][2];
}
/**
* 插入的方法
* @param key
* @param value
*/
public void put(K key, V value) {
if(index >= pairs.length)
throw new IndexOutOfBoundsException();
pairs[index++] = new Object[]{key, value};
}
/**
* 查找方法
* @param key
* @return
*/
public V get(K key) {
for(int i = 0 ; i < index ; i++) {
if(key.equals(pairs[i][0]))
return (V)pairs[i][1];
}
return null;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < index ; i ++) {
sb.append(pairs[i][0]).toString();
sb.append(" : ");
sb.append(pairs[i][1].toString());
if(i < index - 1) {
sb.append("\n");
}
}
return sb.toString();
}
public static void main(String[] args) {
MapVersion01<Integer,String> map = new MapVersion01<Integer,String>(10);
map.put(1,"111");
map.put(2,"222");
map.put(3,"333");
map.put(4,"444");
map.put(5,"555");
map.put(6,"666");
System.err.println(map);
}
单元测试结果:

这里为了方便查看,重写了toString方法,打印出每一个键值对儿,乍一看,实现起来貌似很简单,再看一下Map接口,好像少了点什么。对了,少了2样东西:
- 遍历hash表取键值对的方法;
- 分别得到所有键的集合、值的集合;
这2个问题应该很好实现,下面是我实现的:
public Set<K> keySet() {
Set<K> keySet = new HashSet<K>();
if (pairs.length > 0) {
for (int i = 0; i < index; i++) {
K key = (K) pairs[i][0];
keySet.add(key);
}
}
return keySet;
}
public Set<V> values() {
Set<V> values = new HashSet<V>();
if (pairs.length > 0) {
for (int i = 0; i < index; i++) {
V value = (V) pairs[i][1];
values.add(value);
}
}
return values;
}
public Set<Entry<K, V>> entrySet() {
Set<Entry<K, V>> set = new HashSet<Entry<K, V>>();
if (pairs.length > 0) {
for (int i = 0; i < index; i++) {
K key = (K) pairs[i][0];
V value = (V) pairs[i][1];
Entry<K, V> entry = new Entry<K, V>(key, value);
set.add(entry);
}
}
return set;
}
//键值对存放在一起的映射对象
private static class Entry<K, V> {
private K key;
private V value;
public Entry(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
@Override
public int hashCode() {
return (key == null ? 0 : key.hashCode()) ^ (value == null ? 0 : value.hashCode());
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Entry))
return false;
Entry<K, V> me = (Entry<K, V>) obj;
return (me.getKey() == null ? key == null : me.getKey().equals(key)) &&
(me.getValue() == null ? value == null : me.getValue().equals(value));
}
}
HashMap的简单实现的更多相关文章
- java基础---->hashMap的简单分析(一)
HashMap是一种十分常用的数据结构对象,可以保存键值对.它在项目中用的比较多,今天我们就来学习一下关于它的知识. HashMap的简单使用 一.hashMap的put和get方法 Map<S ...
- HashMap的简单源码分析(看了大佬的源码,基于1.7) put方法
参考博客: https://blog.csdn.net/eson_15/article/details/51158865 hashMap中的几个关键属性 //默认初始容量是16,必须是2的幂 stat ...
- java hashMap缓存简单实现
直接上代码,干货: import java.util.HashMap; import java.util.Map; /** * map缓存 * @author ming * * @param < ...
- java集合: jdk1.8的hashMap原理简单理解
HashMap的数据结构 HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,他的底层结构是一个数组,而数组的元素是一个单向链表.HashMap默认初始化的是一个长度为16位的数 ...
- java.util.HashMap的简单介绍
1. java.util.HashMap的底层实现是数组+链表. 2. 简介put(key, value)方法的执行过程: 1)通过key值,使用散列算法计算出来一个hash值,用来确定该元素需要存储 ...
- 基于C语言的ssdb笔记 ----hashmap的简单实例
ssdb支持 zset, map/hash, list, kv 数据结构,同redis差不多.下面是关于ssdb hsahmap的使用笔记 1.ssdb hashmap的命令 1.hset name ...
- 如果你这么去理解HashMap就会发现它真的很简单
Java中的HashMap相信大家都不陌生,也是大家编程时最常用的数据结构之一,各种面试题更是恨不得掘地三尺的去问HashMap.HashTable.ConcurrentHashMap,无论面试题多么 ...
- 【简易版】HashMap(增删改查)
1.HashMap概述 (1)首先HashMap是基于哈希表的Map接口实现的.另外HashMap中存储的数据是按照键值跟键值对的关系来进行存储的. (2)不同于ArrayList方法的是,Array ...
- JAVA提高十二:HashMap深入分析
首先想说的是关于HashMap源码的分析园子里面应该有很多,并且都是分析得很不错的文章,但是我还是想写出自己的学习总结,以便加深自己的理解,因此就有了此文,另外因为小孩过来了,因此更新速度可能放缓了, ...
随机推荐
- Multitier architecture
Multitier architecture - Wikipedia https://en.wikipedia.org/wiki/Multitier_architecture Common layer ...
- bind_ip
https://docs.mongodb.com/manual/reference/configuration-options/index.html 192.168.2.* --23T10:: I C ...
- android adb源码分析(5)【转】
本文转载自:http://blog.csdn.net/xgbing/article/details/52096880 本篇以“adb devices"命令为例,跟踪代码的执行流程. (1) ...
- HDU2102 A计划 —— BFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others) Me ...
- CentOS 7 安装jdk9
1.下载jdk9 http://download.oracle.com/otn-pub/java/jdk/9.0.4+11/c2514751926b4512b076cc82f959763f/jdk-9 ...
- nginx网站日志配置
用yum安装的nginx的日志默认安装在路径:/var/log/nginx nginx配置文件:/etc/nginx/nginx.conf (总配置文件)/etc/nginx/conf.d/defau ...
- BZOJ_1563_[NOI2009]诗人小G_决策单调性
BZOJ_1563_[NOI2009]诗人小G_决策单调性 Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超 ...
- 【转】implements百科
implements是一个类,实现一个接口用的关键字,它是用来实现接口中定义的抽象方法.实现一个接口,必须实现接口中的所有方法. 中文名 实现 外文名 implements 意 思 类实现一 ...
- python之路,day7-面向对象变成
本篇内容: 面向对象.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法: #@staticmethod只是名义上归类管理,实际上跟类没什么关系 ...
- 021--python装饰器
一.装饰器含义 装饰器本质就是函数,为其它函数添加附加功能 二.装饰器原则 1.不修改被修饰函数的代码 2.不修改被修饰函数的调用方式 三.装饰器知识 装饰器 = 高阶函数 + 函数嵌套 + 闭包 四 ...