zoukankan      html  css  js  c++  java
  • hashmap 实现 相同的key值时,value值叠加效果。

    一,了解一些基础

    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方法就能实现叠加的效果。

    还有些话,后文再聊吧。

  • 相关阅读:
    将博客搬至CSDN
    Linux-进程管理&网络管理
    MySQL架构备份之双机热备
    Linux目录结构&文件管理
    markdown文件即 .md 的基本常用编写语法
    Nginx
    Java 面试题(收集整理...ing)
    CentOS7 VS CentOS8
    Linux 学习
    vi/vim 命令整理
  • 原文地址:https://www.cnblogs.com/ZXF6/p/13656952.html
Copyright © 2011-2022 走看看