基本概念

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. oracle性能监控

    https://blog.csdn.net/yangshangwei/article/details/52449489#监控事例的等待 https://blog.csdn.net/yangshangw ...

  2. regmap使用介绍【转】

    本文转载自:http://blog.csdn.net/hellowxwworld/article/details/10737569 内核3.1引入一套新的API regmap,目的是提取出关于I2C ...

  3. bzoj5483: [Usaco2018 Dec]Balance Beam

    又又又又又又又被踩爆了 首先容易写出这样的期望方程:f(1)=max(d(1),f(2)/2),f(n)=max(d(n),f(n-1)/2), f(i)=max(d(i),(f(i-1)+f(i+1 ...

  4. HDU4280 Island Transport —— 最大流 ISAP算法

    题目链接:https://vjudge.net/problem/HDU-4280 Island Transport Time Limit: 20000/10000 MS (Java/Others)   ...

  5. asp.net下的cookieName

    https://stackoverflow.com/questions/1017144/rename-asp-net-sessionid Add to your web.config:- <sy ...

  6. js实现网页多少秒后自动跳转到指定网址

    在网上搜了一下,关于这个技术处理有多种方法,我只记下我在视频里学到的三种: 1.用一个response.sendRedirect("目标页面.jsp\.htm");实现直接跳转: ...

  7. [原创]java合并word文件

    需求背景 在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何动态生成一张word试卷.事先把题库中的每一道试题都已经保存成一个独立的word文件了,但是在选择了部分试题生成一张word试卷的 ...

  8. codeforces 669D D. Little Artem and Dance(乱搞题)

    题目链接: D. Little Artem and Dance time limit per test 2 seconds memory limit per test 256 megabytes in ...

  9. CentOS6.6详细安装教程(图文教程)

    CentOS 6.x最新版本为CentOS 6.6,下面介绍CentOS 6.6的具体安装配置过程,需要的朋友可以参考下说明: Centos6.6 下载地址:thunder://QUFodHRwOi8 ...

  10. Bootstrap-CL:字体图标(Glyphicons)

    ylbtech-Bootstrap-CL:字体图标(Glyphicons) 1.返回顶部 1. Bootstrap 字体图标(Glyphicons) 本章将讲解字体图标(Glyphicons),并通过 ...