基本概念

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样东西:

  1. 遍历hash表取键值对的方法;
  2. 分别得到所有键的集合、值的集合;

这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的简单实现的更多相关文章

  1. java基础---->hashMap的简单分析(一)

    HashMap是一种十分常用的数据结构对象,可以保存键值对.它在项目中用的比较多,今天我们就来学习一下关于它的知识. HashMap的简单使用 一.hashMap的put和get方法 Map<S ...

  2. HashMap的简单源码分析(看了大佬的源码,基于1.7) put方法

    参考博客: https://blog.csdn.net/eson_15/article/details/51158865 hashMap中的几个关键属性 //默认初始容量是16,必须是2的幂 stat ...

  3. java hashMap缓存简单实现

    直接上代码,干货: import java.util.HashMap; import java.util.Map; /** * map缓存 * @author ming * * @param < ...

  4. java集合: jdk1.8的hashMap原理简单理解

    HashMap的数据结构 HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,他的底层结构是一个数组,而数组的元素是一个单向链表.HashMap默认初始化的是一个长度为16位的数 ...

  5. java.util.HashMap的简单介绍

    1. java.util.HashMap的底层实现是数组+链表. 2. 简介put(key, value)方法的执行过程: 1)通过key值,使用散列算法计算出来一个hash值,用来确定该元素需要存储 ...

  6. 基于C语言的ssdb笔记 ----hashmap的简单实例

    ssdb支持 zset, map/hash, list, kv 数据结构,同redis差不多.下面是关于ssdb hsahmap的使用笔记 1.ssdb hashmap的命令 1.hset name ...

  7. 如果你这么去理解HashMap就会发现它真的很简单

    Java中的HashMap相信大家都不陌生,也是大家编程时最常用的数据结构之一,各种面试题更是恨不得掘地三尺的去问HashMap.HashTable.ConcurrentHashMap,无论面试题多么 ...

  8. 【简易版】HashMap(增删改查)

    1.HashMap概述 (1)首先HashMap是基于哈希表的Map接口实现的.另外HashMap中存储的数据是按照键值跟键值对的关系来进行存储的. (2)不同于ArrayList方法的是,Array ...

  9. JAVA提高十二:HashMap深入分析

    首先想说的是关于HashMap源码的分析园子里面应该有很多,并且都是分析得很不错的文章,但是我还是想写出自己的学习总结,以便加深自己的理解,因此就有了此文,另外因为小孩过来了,因此更新速度可能放缓了, ...

随机推荐

  1. gitlab merge过程

    基本步骤如下: 以我的分支为例 1.创建本地分支,命令 git checkout -b liuping_develop2.创建好分支后提交到远程 ,命令 git push origin liuping ...

  2. 通俗易懂EJB

    摘自:http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问,什么是"服务集群"?什么是" ...

  3. 20170221 SE03 打包请求

    请求处理:SE03 只会有其中两三个功能,还需要学习. 请求打包,是传输请求时候常用的一种方法. 步骤如下: 注意点:1.打包请求一定仔细检查,不要遗漏           如果请求不多,分开传是更好 ...

  4. RTC脚本模型课堂 - ShowMessage(Star5的博客)

    ShowMessage对delphi开发人员而言,是个非常熟悉的玩意,常常需要在软件上做一些合适的提醒,以达到更好的用户体验.今天我们来介绍一下网站里的提示框,也就是JavaSciprt中的alert ...

  5. git apply、git am打补丁.diff 和 .patch【转】

    本文转载自:https://www.jianshu.com/p/e5d801b936b6 前提: 生成patch: git format-patch -M master 生成指定patch,0163b ...

  6. YTU 2451: 股市风云

    2451: 股市风云 时间限制: 1 Sec  内存限制: 128 MB 提交: 37  解决: 25 [提交][状态][讨论版] 题目描述 股市强烈动荡,有涨有跌.现在有一组数据表示各公司的涨跌(涨 ...

  7. 一步一步学Silverlight 2系列(28):图片处理

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  8. IOS中延时执行方式

    本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...

  9. I.MX6 Parallel RGB LCD Datasheet描述

    /******************************************************************** * I.MX6 Parallel RGB LCD Datas ...

  10. 【HDU 1754】 I Hate It

    [题目链接] 点击打开链接 [算法] 树状数组的最值查询 详见这篇文章 : https://blog.csdn.net/u010598215/article/details/48206959 [代码] ...