01.HashMap源码学习整理思维导图

01.HashMap源码学习整理思维导图

蚂蚁课堂

参考学习视频资料: http://www.mayikt.com/

/** * 基于数组实现HashMap * * @author zx * @date 2021年05月05日 13:37 */
public class ArrayHashMap<K, V> {

//先不考虑扩容 HashMap 初始容量为16. ;
// 第一次;当存放的值 16*0.75 =12(容量 * 0.75) 进行扩容,扩容后得到的容量大小为: 16<<1 = 32;
//第二次: 当存放的值32*0.75 = 25 进行扩容 ,扩容大小 32 << 1 = 64
private final Entry[] entries = new Entry[1000];
/** * 添加元素 * * @param k key值 * @param v value值 */
public void add(K k, V v) {

int index = hash(k);
Entry oldEntry = entries[index];
if (oldEntry == null) {

entries[index] = new Entry<>(k, v);
} else {

if (index == 0) {

entries[index] = new Entry<>(k, v);
}
oldEntry.next = new Entry<>(k, v);
}
}
/** * 根据key值获取对应的value * * @param k key值 * @return 返回对应key的value值 */
public V get(K k) {

int index = hash(k);
for (Entry oldEntry = entries[index]; oldEntry != null; oldEntry = oldEntry.next) {

//hashcode相同,我们需要比较内容值
if ((k == null && oldEntry.key == null) || oldEntry.key.equals(k)) {

return (V) oldEntry.value;
}
}
return null;
}
/** * 遍历Map */
public void list() {

if (entries == null) {

System.out.println("集合中没有存放元素,不能为遍历");
}
for (Entry entry : entries) {

if (entry != null) {

Entry temp = entry.next;
while (temp != null) {

System.out.println(temp.key + "---" + temp.value);
temp = temp.next;
}
System.out.println(entry.key + "---" + entry.value);
}
}
}
/** * 计算hash值 * * @param key key值 * @return hash值 */
static int hash(Object key) {

int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
private static class Entry<K, V> {

K key;
V value;
Entry<K, V> next;
public Entry(K key, V value) {

this.key = key;
this.value = value;
}
@Override
public String toString() {

return "Entry{" +
"key=" + key +
", value=" + value +
'}';
}
}
public static void main(String[] args) {

ArrayHashMap<Object, Object> map = new ArrayHashMap<>();
map.add(null, "null value");
map.add(null, "null value2");
map.add("a", "a is hashcode 97");
map.add(97, "97 is hashcode 97");
map.add(98, "98 is hashcode 98");
map.add("b", "b is hashcode 98");
System.out.println("------------------");
map.list();
System.out.println("------------------");
System.out.println(map.get(null));
System.out.println(map.get("a"));
System.out.println(map.get(97));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100717.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • MySQL slave状态之Seconds_Behind_Master

    MySQL slave状态之Seconds_Behind_Master

    2021年11月28日
  • mysql 导入 csv 大文件怎么打开_mysql导入超大内存的csv文件

    mysql 导入 csv 大文件怎么打开_mysql导入超大内存的csv文件1.直接用命令2.用分割器分割,再用导入最后要commit,不然没有真的导入数据库中。其中出现的问题:TheMySQLserverisrunningwiththe–secure-file-privoptionsoitcannotexecutethisstatement解决方法:【我的做法】【必须SQL文件和数据表都要在指定目录中】指定路径查询:showvariabl…

  • eclipse 创建java文件_如何使用eclipse创建一个java文件

    eclipse 创建java文件_如何使用eclipse创建一个java文件1:如何使用eclipse创建一个java文件第一步:创建一个java项目file——>new–>javaproject第二步:创建一个package选中项目右键,选择:new–>package注意:规范。所有单词全部小写,顶级域名倒着写。规则,必须符合标识符的规则。作用:用于管理class类(java源文件),一个包中不能有同名的class。第三步:创建一个class选…

  • java getmethods_method

    java getmethods_methodpublicclassDynamicInvoker{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubDynamicInvokerapp=newDynamicInvoker();app.sayHello(“张三”,2);try{try{app.getClass().getMethod(…

  • 前端MD5加密——js-md5[通俗易懂]

    前端MD5加密——js-md5[通俗易懂]1.概述是通过前台js加密的方式对密码等私密信息进行加密的工具2.js加密的好处(1)用js对私密信息加密可避免在网络中传输明文信息,被人截取数据包而造成数据泄露。(2)避免缓存中自动缓存密码。比如在使用谷歌浏览器登陆时,输入的用户名和密码会自动缓存,下次登陆时无需输入密码就可以实现登陆,这样就给别人留下漏洞,当别人用你电脑登陆或把input的type改为test那么你的密码就泄露…

  • ping 和telnet

    ping 和telnet

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号