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源码的分析园子里面应该有很多,并且都是分析得很不错的文章,但是我还是想写出自己的学习总结,以便加深自己的理解,因此就有了此文,另外因为小孩过来了,因此更新速度可能放缓了, ...
随机推荐
- C语言文件读写Demo
CIODemo.c #include <stdio.h> #include <time.h> #define INPUT_BUFFER_SIZE 100 * 1024 int ...
- Get Luffy Out (poj 2723 二分+2-SAT)
Language: Default Get Luffy Out Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7969 ...
- #import @import #include
1.在xcode5以后 ,Replace #import <Cocoa/Cocoa.h> with @import Cocoa; 在这之前 必须手动设置一下才能用. 2.#import 与 ...
- Hive 自定义函数 UDF UDAF UDTF
1.UDF:用户定义(普通)函数,只对单行数值产生作用: 继承UDF类,添加方法 evaluate() /** * @function 自定义UDF统计最小值 * @author John * */ ...
- 自己封装的Ajax - JavaScript
1. [代码][JavaScript]代码 //javascript Object: ajax Object//Created By RexLeefunction Ajax(url,data ...
- skynet实践(8)-接入websocket
我从开源项目(https://github.com/lipp/lua-websockets,这里我们简称LWS)中抽出了websocket的部分处理,步骤如下: 1)首先是解决LWS的几个依赖问题.L ...
- UVA140 剪枝
题目 分析:这个题的数据范围很小,直接打印全排列去判断也能过,但是这里存在两个剪枝,第一个,如果当前的距离已经大于前面距离的最小值,则剪枝,还有一个就是如果与当前结点相连的边数大于等于前面距离的最小值 ...
- Java多线程:线程状态以及wait(), notify(), notifyAll()
一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...
- Python-day-9- RabbitMQ队列
RabbitMQ队列 安装 http://www.rabbitmq.com/install-standalone-mac.html 安装python rabbitMQ module pip insta ...
- vs2008工程部署不成功,可能是远程文件路径出现问题
解决方法: 修改工程属性页的配置属性 调试中的远程可执行文件的路径 部署中的远程目录的路径