JDK1.7版 底层使用 数组+链表实现
package com.company; import java.util.HashMap; /** * @author Vijay * @date 2020/4/28 -18:47 */ public class MyHashMap<K,V> { private Entry[] table; //定义数组,也就是哈希表 private static final Integer CAPACITY=8; //默认为数组长度为8 0-7 private int size=0; //map长度 public MyHashMap() { this.table=new Entry[CAPACITY];//当map对象创建时,让数组为8个类型为Entry类型 } public Object get(Object key) { int i = key.hashCode(); int index=i%8; for (Entry<K,V> entry=table[index] ;entry!=null;entry=entry.next) { if (entry.k.equals(key)) { return entry.v; } } return null; } public Object put(K key,V value) //模仿map存值 { int i = key.hashCode(); //用map的key获取hashcode 对8取余,获取数组下标位置 int index=i%8;
//用for循环判断新存的值是否与存入的值相同,相同就不替换,
for (Entry<K,V> entry=table[index] ;entry!=null;entry=entry.next) { if (entry.k.equals(key)) { V oldValue=entry.v; entry.v=value; return oldValue; //不替换 } } addEntry(key, value, index); return null; } //添加元素 private void addEntry(K key, V value, int index) { Entry entry = new Entry<>(key, value, table[index]); table[index]=entry; size++;//元素加1 } public int size() {
//还回元素 return size; } public static void main(String[] args) { MyHashMap<String, String > map = new MyHashMap<>(); map.put("张三","sad"); map.put("李四","sads"); map.put("王五","sad2"); map.put("奥迪","sadd"); map.put("大蘇打","sad3"); } class Entry<K,V> { private K k; private V v; private Entry<K,V> next; public K getK() { return k; } public V getV() { return v; } public Entry<K, V> getNext() { return next; } public Entry(K k, V v, Entry<K, V> next) { this.k = k; this.v = v; this.next = next;//存下一个 } } }