Java手写简单HashMap一(包括增加,查找,toString,泛型)
@Java 300 学习总结
HashMap底层采用实现采用了哈希表,结合了“数组和链表”。
原理如图
一、定义HashMap类。
首先需要定义一个节点来存储数据,构成链表结构。
public class Node {
int hash;
Object key;
Object value;
Node next;
}
public class ggHashMap {
Node[] table; //位桶数组,用于存放链表的第一个节点
int size;
public ggHashMap() {
super();
table = new Node[16]; //默认初始为16
}
public static void main(String[] args) {
ggHashMap m1 = new ggHashMap();
System.out.println();
}
}
二、实现put方法,往HashMap里添加元素
每一个节点存放进HashMap里,首先根据key继续Hash值,以此确定插入的位置。
public int myHash(int v,int length) {
return v&(length -1);//根据Hash值与位桶数组长度,进行位运算,保证插入元素的随机
//位运算与取模运算效果相同,但是效率更高
}
public void put(Object key, Object value) {
Node newNode = new Node();
newNode.hash = myHash(key.hashCode(),table.length);
//根据key的值取hash值,hashCode()为对象默认存在的方法
newNode.key = key;
newNode.value = value;
newNode.next = null;
Node temp = table[newNode.hash];//指向要插入的数组位置
Node iterLast = null;//正在遍历的最后一个元素
boolean keyRepeat = false;//判定元素key值是否相同被覆盖
if(temp == null) { //数组元素为空
table[newNode.hash] = newNode;
}
else { //不为空的情况
while(temp!=null) { //遍历该链表
//判断key是否重复
if(temp.key.equals(key)) {
keyRepeat = true;
temp.value = value;
break; //找到重复结束遍历
}else {
iterLast = temp; //iterLast跟着temp向后移一位
temp = temp.next;
}
}
if(!keyRepeat) {
iterLast.next = newNode; //没有发现重复,最后一位的next,指向新节点
}
}
}
三、实现toString方法
利用可以自动扩增的StringBuilder对象,遍历每个节点,可实现数据的HashMap的字符串。
public String toString() {
StringBuilder sb = new StringBuilder("{");
for(int i = 0;i < table.length;i++) {
Node temp = table[i];
while(temp!=null) {
sb.append(temp.key+":"+temp.value + ",");
temp = temp.next;
}
}
sb.setCharAt(sb.length()-1, '}');//将最后一个,号,转为}
return sb.toString();
}
四、实现get方法,根据key获得value
根据key值计算hash数值,指针指向数组索引值和hash值相等的节点,遍历该节点的链表,找到key值相等的节点,返回value值
public Object get(Object key) {
int hash = myHash(key.hashCode(), table.length);
Object value = null;
Node temp = table[hash];
while(temp!=null) {
if(temp.key.equals(key)) {
value = temp.value;
break;
}else {
temp = temp.next;
}
}
return value;
}
五、增加泛型
public class Node2<K,V> {
int hash;
K key;
V value;
Node2 next;
}
public class ggHashMap4<K,V> {
public V get(K key) {
}
public void put(K key, V value) {
}
}
Java手写简单HashMap一(包括增加,查找,toString,泛型)的更多相关文章
- Java手写简单Linkedlist一(包括增加,插入,查找,toString,remove功能)
@Java300 学习总结 一.自定义节点 LinkList底层为双向链表.特点为查询效率低,但增删效率高,线程不安全. 链表数据储存在节点,且每个节点有指向上个和下个节点的指针. 创建ggLinke ...
- 利用Java手写简单的httpserver
前言: 在看完尚学堂JAVA300中讲解如何实现一个最简单的httpserver部分的视频之后, 一.前置知识 1.HTTP协议 当前互联网网页访问主要采用了B/S的模式,既一个浏览器,一个服务器,浏 ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- java 手写 jvm高性能缓存
java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 package com.ws.commons.cache; import java.util.function.Func ...
- java手写多级缓存
多级缓存实现类,时间有限,该类未抽取接口,目前只支持两级缓存:JVM缓存(实现 请查看上一篇:java 手写JVM高性能缓存).redis缓存(在spring 的 redisTemplate 基础实现 ...
- 不使用Tomcat,手写简单的web服务
背景: 公司使用的YDB提供了http的查询数据库服务,直接通过url传入sql语句查询数据-_-||.ydb的使用参照:https://www.cnblogs.com/hd-zg/p/7115112 ...
- 手写简单call,apply,bind
分析一下call的使用方法:call是显示绑定this指向,然后第一个参数是你所指向的this对象,后面跟着多个参数,以逗号隔开 function sum(num1,num2){ return num ...
- 手写简单的jq雪花飘落
闲来无事,准备写个雪花飘落的效果,没有写太牛逼的特效,极大的简化了代码量,这样容易读取代码,用起来也很简单,对于那些小白简直是福利啊,简单易读易学.先直接上代码吧,然后再一一讲解,直接复制粘贴就可以拿 ...
- Java:手写幼儿园级线程安全LRU缓存X探究影响命中率的因素
最近遇到一个需求,需要频繁访问数据库,但是访问的内容只是 id + 名称 这样的简单键值对. 频繁的访问数据库,网络上和内存上都会给数据库服务器带来不小负担. 于是打算写一个简单的LRU缓存来缓存这样 ...
随机推荐
- https服务
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/bright69/article/deta ...
- javaEE项目部署方式
1.手动部署 2.自动化部署 “自动化”的具体体现:向版本库提交新的代码后,应运服务器上自动部署
- 自定义镜像mycentos
1.编写 1).Hub默认CentOS镜像是什么情况 2).编写Dockerfile文件 2.构建 3.运行
- 消灭WinRAR广告
1. 问题描述 WinRAR每次弹出的广告真的令人厌烦至极,虽然软件公司也得恰饭,免费给你用总得看俩广告吧,但是像我这样经常用WinRAR的人来说广告弹出频率未免也太过分了.一开始还只是用火绒的弹窗拦 ...
- Java同步数据结构之ConcurrentLinkedDeque
前言 由于LinkedBlockingDeque作为双端队列的实现,采用了单锁的保守策略使其不利于多线程并发情况下的使用,故ConcurrentLinkedDeque应运而生,它是一种基于链表的无界的 ...
- LC 981. Time Based Key-Value Store
Create a timebased key-value store class TimeMap, that supports two operations. 1. set(string key, s ...
- Smarty 获取当前日期时间和格式化日期时间
在Smarty 中获取当前日期时间和格式化日期时间与PHP中有些不同的地方,这里就为您详细介绍: 首先是获取当前的日期时间:在PHP中我们会使用date函数来获取当前的时间,实例代码如下:date(& ...
- Linux Mint设置自定义快捷键
我使用的是 Linux Mint 19.2 Tina 先搜索键盘,把键盘的功能调出来 快捷键--->>自定义快捷键--->>添加自定义快捷键 名称可自定义(这里我定义的是“截图 ...
- 14Flutter StatefulWidget有状态组件、页面上绑定数据、改变页面数据、实现计数器功能、动态列表
/** * Flutter StatefulWidget有状态组件.页面上绑定数据.改变页面数据 * 在Flutter中自定义组件其实就是一个类,这个类需要继承StatelessWidget/Stat ...
- mac下不允许安装除了app store之外的软件设置:
1.dock栏的系统偏好设置. 2.找到安全性与隐私 3.点击面板中的通用,在点击左小角的锁按钮, 4.选择任何来源,确定就可以了.[如果只有两个选项,而没有任何来源的话,打开终端,执行:sudo s ...