简单实现HashMap中数组 + 链表
- 新建数组,
- 添加的元素下标 为 hashCode % 数组长度
- 里面存储自定义节点对象,下标值相同的存储到next中,依次向下存储
public class MyHashMap<K, V> {
//节点数组
private Entry<K, V>[] table;
//定义初始数组容量
private static Integer CAPACITRY = 5;
//元素数量
private Integer size = 0;
//封装一个节点
class Entry<K, V> {
private K k;
private V v;
private Entry<K, V> next;
public Entry(K k, V v, Entry<K, V> next) {
this.k = k;
this.v = v;
this.next = next;
}
@Override
public String toString() {
return this.k+"-"+this.v+"-"+ this.next;
}
}
public MyHashMap() {
//自定义一个数组进行存放元素
this.table = new Entry[CAPACITRY];
}
public int size() {
return size;
}
public V get(K key) {
Integer hash = key.hashCode();
Integer index = hash % table.length;
for (Entry<K, V> entry = table[index]; entry != null; entry = entry.next) {
if (key.equals(entry.k)) {
return entry.v;
}
}
return null;
}
public Object put(K key, V value) {
Integer hash = key.hashCode();
System.out.println("hash=="+hash);
//下标 哈希值 对 数组长度 取模
//下标值为 0 - 数组长度的值 这样能分配数组
Integer index = hash % table.length;
//覆盖旧Value
for (Entry<K, V> entry = table[index]; entry != null; entry = entry.next) {
if (key.equals(entry.k)) {
//V oldValue = entry.v;
entry.v = value;
//return oldValue;
}
}
//存储节点对象 节点对象中存储着key和value 并且含有指针指向head
addEntry(key, value, index);
return null;
}
private void addEntry(K key, V value, Integer index) {
System.out.println(table[index]);
table[index] = new Entry<>(key, value, table[index]);
size++;
}
public static <V, K> void main(String[] args) {
MyHashMap myHashMap = new MyHashMap();
myHashMap.put(1,"张三1");
myHashMap.put(2,"张三2");
myHashMap.put(3,"张三3");
myHashMap.put(4,"张三4");
myHashMap.put(5,"张三5");
myHashMap.put(6,"张三6");
}
}