package day01; import java.security.Key; /** * @version 1.0 * @ClassName Test01 * @category javaSE * @QQ 1826286736 * @Author ${每特教育JY-010-小萌新} * @Date 2022年01月29日 16:33 **/ public class HashMap01<k, v> { /** * 定义一个Object数组 * 假设Object数组基础容量为1000 */ private Entry[] entrys = new Entry[1000]; /** * 1 创建一个容器Entry存放键值对 */ class Entry<K, V> { // key K k; // Value V v; // hash值 int hash; // 链表 Entry<K, V> next; public Entry(K k, V v, int hash) { this.k = k; this.v = v; this.hash = hash; } } public void put(k K, v v) { /** * 1 根据key的hashcode值取余entrys.length * 得到的值就是该key存放在entrys数组中的index位置 * 1.先判断该位置是否存有链表 * 2.如果能够取出该entry对象,则该位置已经存放,就会形成一个链表 * 如果没有取出来,则该位置为空,可以直接存放 */ int hash = K.hashCode(); int index = hash % entrys.length; Entry entry = entrys[index]; if (entry == null) { entrys[index] = new Entry<>(K, v, hash); } else { entry.next = new Entry<>(K, v, hash); } } public v get(k K) { /** * 根据key获取到Value值 * 因为key的值是相同的,hashcode也是相同的,所以再取entrys.length的余数也是相同的 * 最终index值也是和put方法的index值一样 */ int hash = K.hashCode(); int index = K.hashCode() % entrys.length; for (Entry<k, v> entry = entrys[index]; entry != null; entry = entry.next) if (entry.hash == hash && (entry.k == K || entry.k.equals(K))) { return entry.v; } return null; } public static void main(String[] args) { HashMap01<Object, Object> hshMap01 = new HashMap01<>(); hshMap01.put("a", "mete"); hshMap01.put(97, "mete666"); System.out.println("根据key获取到的Value值:" + hshMap01.get("a")); System.out.println("根据key获取到的Value值:" + hshMap01.get(97)); } /** * hashcode值相同但是值不相同就会发生hash冲突问题 * 例如key="a"和key=97 计算的hashcode值相同 ,最终的index也相同 *如果在HashMap集合中发生Hash冲突问题是使用链表数据结构来解决(存放)的 */ }
尝试手写HashMap
最新推荐文章于 2024-06-12 23:40:32 发布