刚入坑java半年,现在总结一下自己学到的东西
1、首先我们先来聊聊什么是HashMap?
什么是hash?hash用中文的说法就叫做“散列”,通俗的讲就是把任意长度的字符串输入,经过hash计算出固定长度的字符串。而这个字符串就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
2、hash碰撞?
上面已经说到了,不同的输入值可能会计算出相同的输出,这就是碰撞。
3、java中的hashMap是怎么实现的?
java的hashMap底层是用数组加链表实现的。存储对象的时候,我们是将K/V传给put方法,然后这个put方法会调用hashCode方法计算出hash值(也就是数组的下标)从而得到存储的位置,进一步存储。那么问题来了,我们都知道,创建数组的时候是要指定数组的长度的,万一它的初始化的数组不够用怎么办?其实hashMap早都给你想好了,hashMap会根据当前你存储的数据的占用情况自动调整数组的长度。获取对象的时候,我们是把K传给get()方法,它就会调用hashCode计算hash的值从而得到存储位置,并且进一步调用equals方法确定键值对。发生碰撞的时候:HashMap通过链表将产生碰撞冲突的元素组织起来,在Java8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。关于解决hash冲突的方法在这里暂且不说,我直接上代码了。
4、代码
首先我们先定义一个Map接口:
package com.jian.utils;
/**
* Map