一,了解一些基础

package com.ohs.demo;

/**
*
* 一、需求是:停止相同的key值,覆盖效果,将重复的value值,叠加起来。
*
* 二、hash? 什么是hash?
* 简单的说说hashmap,我们都知道,
* 1.他提供的PUT 方法在,hashmap中 添加新的元素
* 2.GET 方法可以获得 key值 对应的 value 值。
*
* map 前面 是 hash,那么什么又是hash呢?
* 学过数据结构的同学,应该知道,hash是一种数据结构,我们来看一下他的定义、
*
* 【哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。
* 哈希值是一段数据唯一且极其紧凑的数值表示形式。
* 如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。
* 要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。-----------------------------------》 【这里有一个hash碰撞的问题,以后再说】
* 一般用于快速查找和加密算法 ---《数据结构与算法分析》】
*
* 简单的来说,电脑可以理解的都是一些二进制的玩意, 使用hash算法,可以将任意长度的二进制 【映射】为较短的固定的二进制值。 这个小的二进制值,就是我么的哈希值 【压缩映射】 所占的空间也更小。
*
* 也就是说,现在我们,通过查找一个较小的二进制,就能找到原本可能是非常长的二进制文件,就查找的效率上而言,是不是非常的快。
*
* 三、哈希表? 什么玩意?
*
* 定义:
* 【散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
* 这个映射函数叫做散列函数,存放记录的数组叫做散列表。】
*
* 我的简单理解, 之前通过hash算法 获得了一个哈希值,然后我们将很多哈希值放在一张表里面,就组成了一张哈希表。根据这种哈希表,就能快速的找到很多对应的值。
*
*
* 四 实现需求。
*
*/ public class HashDemo {
}

二,看看hashmap的内心世界

HashMap   = 数组 +  链表

左边是数组,右边是在数组上对应的一些Node 节点。

node 里面  就是一个  key的哈希值  和 对应的value值。

JDK 1.8 的改变?  把我心目中的神  红黑树加入进来了!了解即可。

三, 重写hashmap的 put 方法。

package com.ohs.demo;
import java.util.HashMap; /**
* 1. 在hashmap中,重复的key值,会被后面的key值对应的value给覆盖掉。
* (“1”,"哈哈") (”1“,“嘻嘻”)
*
* 覆盖的原因?
* 我们知道hashmap 的底层是由数组和链表实现的。
* 数组查询的效率远远高于链表
* 而链表的 增 删 比较方便
* 所以 hashmap 是一个很 优秀的 容器。
*
*
* put
* (”1“,“嘻嘻”) 当一个新的键值对,添加到hashmap的时候,
* 找到他在数组中对应的位置,然后看在这个位置上的链表
* 获得“ 1 ” 的哈希值,和节点上的哈希值进行比较,找到后,看value 是否存在,有,就实现覆盖操作。
* 没有,就添加。 同理,get 方法,就是在里获得value的值,没有就是一个 null 值。 注意 value 可以有很多 null 值
*
* 【key】值 只有一个是null?
* 但是 当 key 值,有很多是空值时,后面的空值,会把前面的空值给覆盖掉, 类似于put 方法中 的value 值。 也是进行了覆盖的操作。 * 2.自己创建一个 Myhashmap 让他继承 hashmap 重写它的方法 实现覆盖的效果。
*
*/ public class MyHashMap<K> extends HashMap<K,String> { //传递一个新的 key value 值 @Override
public String put(K key, String value) { // 定义一个新的value 接收 后面put的新的value值
String NewVaule = value; //containsKey 判断这个 key 是否已经存在?
if (containsKey(key)){ // 获得旧的value 值
String oldValue = get(key); //将旧值 和 后面put 的新值拼接起来
NewVaule = oldValue + "------" +NewVaule;
} // 返回拼接后的newvalue
return super.put(key, NewVaule);
}
}

实验一下?

package com.ohs.demo;
import java.util.HashMap;
public class DmeoString {
public static void main(String[] args) {
HashMap hashMap = new HashMap(); hashMap.put("1","龙猫");
hashMap.put("1","千寻");
hashMap.put("2", "");
hashMap.put("3", ""); //haspmap 中 key 值 唯一性的原因 新的 【key = null 】 将 旧的值 给替换了。
hashMap.put("","第一个key是null");
hashMap.put("","第二个可以也是null"); //测试自己冲写后的put 方法
HashMap MyhashMap = new MyHashMap();
MyhashMap.put("1","龙猫");
MyhashMap.put("1","千寻"); System.out.println(hashMap.toString());
System.out.println("----自定义的MyHashMap方法----");
System.out.println(MyhashMap.toString());
}
}

四,重写  hashCode 和  equals  方法?

注意在上文中 我所用的key 值得类型是 string  类型,然后在自建的MyHashMap 中重写了一个put 方法。实现了重复的value值 叠加效果,

在string 内部,其实已经重写了 这两个方法。所以直接重写一个put方法就能实现叠加的效果。

还有些话,后文再聊吧。

hashmap 实现 相同的key值时,value值叠加效果。的更多相关文章

  1. Java Map 在put值时value值不被覆盖

    一.问题描述 最近在代码开发中遇到一个问题,在往Map中put文件路径值然后把Map放到List中去时,遇到问题是Map的后一个值总是把前一个值覆盖,导致最后Map中只有一个值. 二.解决办法(有如下 ...

  2. 解决 java循环中使用 Map时 在put值时value值被覆盖的问题

    其实很简单,只需要把容器换成list 然后在循环中,每次循环末尾map = new HashMap() 或者直接在循环中一开始就实例化hashmap(Map map = new HashMap();) ...

  3. SQL约束(主键约束、外键约束、自动递增、不允许空值、值唯一、值默认、值限制范围)

    NOT NULL 不允许空值约束 NOT NULL 约束强制列不接受 NULL 值(NULL值就是没有值或缺值).NOT NULL 约束强制字段始终包含值,即不向字段添加值,就无法插入新记录或者更新记 ...

  4. 对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值

    对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值?请参阅下面的关键代码: <html> <head> & ...

  5. 2021-2-17:Java HashMap 的中 key 的哈希值是如何计算的,为何这么计算?

    首先,我们知道 HashMap 的底层实现是开放地址法 + 链地址法的方式来实现. 即数组 + 链表的实现方式,通过计算哈希值,找到数组对应的位置,如果已存在元素,就加到这个位置的链表上.在 Java ...

  6. js提取对象的key值和value值

    在代码中,遇到需要单独提取对象的key值时 可使用 Object.keys(object)  object是你需要操作的对象 Object.keys()会返回一个存储对象中所有key值的数组 获取当前 ...

  7. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

  8. WPF学习笔记——在“System.Windows.StaticResourceExtension”上提供值时引发了异常

    在"System.Windows.StaticResourceExtension"上提供值时引发了异常 因应需要,写了一个转换器,然后窗体上引用,结果就出来这个错.编译的时候没事, ...

  9. MySQL枚举类型enum字段在插入不在指定范围的值时, 是否是"插入了enum的第一个值"?

    刚刚在看<<深入浅出MySQL>>一书的"ENUM类型"一节, 以下面的代码举例, 得出结论: "还可以看出对于不在ENUM指定范围内的值时, 并 ...

随机推荐

  1. 【LeetCode】486. Predict the Winner 解题报告(Python)

    [LeetCode]486. Predict the Winner 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...

  2. 【LeetCode】331. Verify Preorder Serialization of a Binary Tree 解题报告(Python)

    [LeetCode]331. Verify Preorder Serialization of a Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https:/ ...

  3. 1036 - A Refining Company

    1036 - A Refining Company   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 ...

  4. OA系统中手写签批功能的实现

    一.需求背景 OA系统审批中,有对word或者pdf文件源文档在指定的位置可以插入相应的文字,其实就是一个审批的功能,到了指定的人那边,他可以进行签批.这个功能一般来说,是针对于领导方面,对于一个事情 ...

  5. 使用.NET 6开发TodoList应用(15)——实现查询搜索

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 本文我们继续来看查询过程中的另外一个需求:搜索.搜索的含义是目标字段的全部或者部分值匹配请求中的搜索条件,对应到数据库层面是C ...

  6. 使用 DML语句,对 “锦图网” 数据进行操作,连接查询(内连接,左外连接,右外连接,全连接)

    查看本章节 查看作业目录 需求说明: 对 "锦图网" 数据进行操作: 统计每一种线路类型的线路数量.最高线路价格.最低线路价格和平均线路价格,要求按照线路数量和平均线路价格升序显示 ...

  7. 使用 jQuery 选择器获取页面元素后,利用 jQuery 对象的 css() 方法设置其样式。

    查看本章节 查看作业目录 需求说明: 使用 jQuery 选择器获取页面元素后,利用 jQuery 对象的 css() 方法设置其样式. 要求如下: 点击页面的"更改样式"按钮后, ...

  8. vue grammer one

    本文所有内容均来自 书籍<vue.js实战> 完整代码请查看github v-model <!DOCTYPE html> <html> <head> & ...

  9. docker学习:docker容器数据卷

    是什么 docker的理念 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 docker容器产生的数据,如果不通过docker ...

  10. java 代理模式 总结

    1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...