简单实现jdk1.7HashMap

news2024/11/19 2:38:22

 1.定义一个Map接口,Entry<K,V>对象为Map的元素

package test;

public interface Map<K,V> {
    V put(K k,V v);
    V get(K k);
    int size();

    interface Entry<K,V>{
       K getKey();
       V getValue();
    }

}

2.主要实现了put,get以及size()方法

package test;


public class HashMap<K, V> implements Map<K, V> {
    Entry[] table = null;
    int size;

    HashMap() {
        table = new Entry[16];
    }

    /**
     * 1.hashCode(k),算出哈希值
     * 2.取余运算算出index索引值
     * 3.是否有值,如果没有值则添加,有值则添加到链表中
     *
     * @param k
     * @param v
     * @return
     */
    @Override
    public V put(K k, V v) {
        int index = hash(k);
        System.out.println(k.hashCode());
        if (table[index] == null) {
            table[index] = new Entry(k, v, k.hashCode(), null);
            size++;
        } else {
            table[index] = new Entry(k, v, k.hashCode(), table[index]);
        }
        return (V) table[index].getValue();
    }

    private int hash(K k) {
        int i = k.hashCode() % 16;
        return i > 0 ? i : Math.abs(i);
    }

    /**
     * 1.通过k获取到hashCode值
     * 2.算出index
     * 3.判断k是否相等,如果相等则返回,如果不等则判断其他链表是否相等
     *
     * @param k
     * @return
     */
    @Override
    public V get(K k) {
        int hash = hash(k);
        Entry<K, V> entry = table[hash];
        return findValueByKey(entry, k);
    }

    private V findValueByKey(Entry<K, V> entry, K k) {
        if (entry == null) {
            return null;
        }
        if (entry.getKey().equals(k) || k == entry.getKey()) {
            return (V) entry.getValue();
        } else if (entry.next != null) {
            return (V) findValueByKey(entry.next, k);
        }
        return null;
    }

    @Override
    public int size() {
        return size;
    }

    static class Entry<K, V> implements Map.Entry<K, V> {
        K k;
        V v;
        int hashCode;
        Entry<K, V> next;

        public Entry(K k, V v, int hashCode, Entry<K, V> next) {
            this.k = k;
            this.v = v;
            this.hashCode = hashCode;
            this.next = next;
        }

        @Override
        public K getKey() {
            return this.k;
        }

        @Override
        public V getValue() {
            return this.v;
        }
    }
}

3.测试

package test;



public class test {
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<String,Object>();
        map.put("lzf", "海淀");
        map.put("zhx", "昌平");
        map.put("wq", "朝阳");
        int size = map.size();
        System.out.println(map.get("lzf"));
        System.out.println(map.get("zhx"));
        System.out.println(map.get("wq"));
        System.out.println("size = " + size);
    }
}

4.结果

 其中"zhx"和"wq"索引值相同出项hash冲突,按照头插法放入链表中.

hashMap和ArrayList其实差不多,arrayList自带索引值,而hashMap是通过算出key的hashCode在通过一系列的位运算得出hash值,hash值^table.length-1得到索引值.

为什么hashMap的容量要是2的幂次方

首先计算键值对的索引要满足两个要求:不能越界、均匀分布

而 h % length (h根据key计算出来的哈希值)就能满足这一点,但是取模运算速度较慢。

容量为2的次幂时、而 h & (length-1)刚好也能满足,而且按位与运算速度很快。

所以最终结果我认为:HashMap容量为2的次幂 开始是为了提高计算索引速度,但在解决哈希冲突过高的过程中通过右移+异或打乱哈希值,使得哈希冲突大大减少

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp小程序,根据小程序的环境版本,控制的显页面功能按钮的示隐藏

需求&#xff1a;根据小程序环境控制控制页面某个功能按钮的显示隐藏&#xff1b; 下面是官方文档和功能实现的相关代码&#xff1a; 实现上面需要&#xff0c;用到了uni.getAccountInfoSync()&#xff1a; uni.getAccountInfoSync() 是一个 Uniapp 提供的同步方法&#xff0c…

零代码编程:用ChatGPT对Excel表格进行批量自动化处理

F盘的“北交所上市公司全部发明专利”文件夹里面有几百个这样的Excel表格&#xff0c;格式一致&#xff0c;需要合并所有表格内容到一个表格&#xff0c;方便查找内容&#xff0c;但是不要前面两行。 可以在ChatGPT中这样输入&#xff1a; 写一段Python程序&#xff1a; F盘的…

基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!

前言 使用摄像头实时识别数字算是目标检测任务&#xff0c;总体上分为两步&#xff0c;第一步是检测到数字卡片的位置&#xff0c;第二步是对检测到的数字卡片进行分类以确定其是哪个数字。在第一步中主要涉及opencv的相关功能&#xff0c;第二步则使用机器学习的方式进行分类…

求三个球面交点的高效解法

文章目录 一、问题描述二、推导步骤代数法几何法 三、MATLAB代码 一、问题描述 如图&#xff0c;已知三个球面的球心坐标分别为 P 1 ( x 1 , y 1 , z 1 ) , P 2 ( x 2 , y 2 , z 2 ) , P 3 ( x 3 , y 3 , z 3 ) P_1(x_1,y_1,z_1),P_2(x_2,y_2,z_2),P_3(x_3,y_3,z_3) P1​(x1​,…

浏览器访问nginx转发打开oss上的html页面默认是下载,修改为预览

使用阿里云盒OSS上传了html页面&#xff0c;在nginx里配置跳转访问该页面时&#xff0c;在浏览器里直接默认下载了该页面&#xff0c;现在想实现预览功能&#xff0c;只需在nginx里的location里修改消息头的Content-Disposition为inline即可 注意要隐藏头信息proxy_hide_header…

【机器学习】西瓜书习题3.3Python编程实现对数几率回归

参考代码 结合自己的理解&#xff0c;添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt from sklearn import linear_model导入数据&#xff0c;进行数据处理和特征工程 # 1.数据处理&#x…

ChatGPT炒股:爬取股票官方微信公众号的新闻资讯

上市公司的微信公众号&#xff0c;现在已经成为官网之外最重要的官方信息发布渠道。有些不会在股票公告中发布的消息&#xff0c;也会在微信公众号进行发布。所以&#xff0c;跟踪持仓股票的公众号信息&#xff0c;非常重要。 下面&#xff0c;以贝特瑞的官方公众号“贝特瑞新…

合并两个有序数组——力扣88

文章目录 题目描述法一 双指针法二 逆向双指针 题目描述 法一 双指针 使用双指针方法&#xff0c;将两个数组看作队列&#xff0c;每次从两个数组头部取出比较小的数字放到结果中。 void merge(vector<int>&nums1, int m,vector<int>&nums2, int n){int p1…

无涯教程-jQuery - Select menu组件函数

小部件选择菜单功能可与JqueryUI中的小部件一起使用&#xff0c;它提供了可替换样式的选择元素。一个简单的选择菜单如下所示。 Select menu - 语法 $( "#menu" ).selectmenu(); Select menu - 示例 以下是显示选择菜单用法的简单示例- <!doctype html> &…

关于Java的多线程实现

多线程介绍 进程&#xff1a;进程指正在运行的程序。确切的来说&#xff0c;当一个程序进入内存运行&#xff0c;即变成一个进程&#xff0c;进程是处于运行过程中的程序&#xff0c;并且具有一定独立功能。 线程&#xff1a;线程是进程中的一个执行单元&#xff0c;负责当前进…

大数据课程D11——hadoop的Ganglia

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Ganglia的概念&#xff1b; ⚪ 掌握Ganglia的安装操作&#xff1b; ⚪ 掌握Ganglia的监控Flume操作&#xff1b; 一、概述 1. Ganglia是UC Berkeley发起的一个开源…

JVM基础篇-程序计数器

程序计数器 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用:记住下一条jvm指令的执行地址特点 是线程私有的:每个线程都有自己的程序计数器不会存在内存溢出(规定) 作用 左侧:jvm指令 右侧:java代码 0: getstatic #20 // PrintSt…

三维点云与深度图相互转换

点云转深度图 一、效果二、实现原理与代码2.1 获取点云边界2.2 确定图像大小2.3 稀疏点图像填充2.4 完整代码三、由深度图转换回点云信息丢失问题3.1 深度图转点云3.2 深度图转点云代码3.3 多视角的深度图融合一、效果 对点云进行转换,z向表示深度,转换效果如下 二、实现…

Docker安装配置启动Oracle11g容器解决ORA-12541:TNS: 无监听程序连接第三方客户端

Windows下安装可参考我这篇&#xff1a;win11&win7下安装oracle11g数据库全过程 一、下载与启动 前提&#xff1a;需要安装配置好docker(设置镜像源、配置阿里云加速)等&#xff0c;可参考我这篇 基于CentOS7安装配置docker与docker-compose 。 Docker容器相关操作可参考…

【自动化运维】playbook剧本

目录 一、Ansible 的脚本 playbook 剧本1.1playbooks的组成 二、剧本编写实验2.1定义、引用变量2.2使用远程主机sudo切换用户2.3whenn条件判断2.4迭代 三、Templates 模板四、Tags模板 一、Ansible 的脚本 playbook 剧本 1.1playbooks的组成 &#xff08;1&#xff09;Tasks&…

Diffusion扩散模型学习2——Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例

Diffusion扩散模型学习2——Stable Diffusion结构解析-以文本生成图像&#xff08;文生图&#xff0c;txt2img&#xff09;为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion&#xff08;SD&#xff09;二、Stable Diffusion的组成三、生成流程1、文本编码2、采样流…

Python自动化测试----生成测试报告

如何才能让用例自动运行完之后&#xff0c;生成一张直观可看易懂的测试报告呢&#xff1f; 对于自动化测试有兴趣的朋友可以观看这个视频&#xff1a; 【整整200集】超超超详细的Python接口自动化测试进阶教程&#xff0c;真实模拟企业项目实战&#xff01;&#xff01; 小编使…

【Ap模块EM】09- 什么是Manifest?

先直观感受一下下面的这个服务定义: -fidl文字描述版本: arxml版本: 了解Manifest之前,我们了解一下AutoSAR是怎么开发的? AUTOSAR方法论 AUTOSAR 提供了一种开发方法论,该方法描述了从抽象系统定义一直到最终 EUC 可执行文件的流程步骤,并包含设计步骤和工作产品列…

读取application-dev.properties的中文乱码【bug】

读取application-dev.properties的中文编码【bug】 2023-7-30 22:37:46 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.net/qq_51625007 禁止其他平台发布时删除以上此话 bug 读取application-dev.propert…

详解Unity中的Nav Mesh|导航寻路系统 (一)

前言 在类RTS、RPG游戏中&#xff0c;都会提供自动寻路功能&#xff0c;当玩家下达指令后&#xff0c;NPC就会自动计算到达目标的路径&#xff0c;实现这种功能的方式有很多种&#xff0c;其中Unity本身也自带了一种导航寻路系统&#xff0c;该系统会将游戏场景中复杂的对象烘…