容易理解的简单的HashMap实现
程序员文章站
2022-03-02 09:41:18
...
创建最简单的hashmap实现,希望能分享给跟我一样的小白理解一下链表和数组如何实现HashMap。(扩容就不写了,红黑树不会,有问题麻烦指正别让我误导别人o.o)
package www.nz.HashMapTest;
//定义你的结点,采用泛型类让数据的类型能变得更多
class Node<K,V>{
K k;
V v;
Node<K,V> next;
//构造器,将存的值变成结点
public Node(K k, V v, Node<K, V> next) {
this.k = k;
this.v = v;
this.next = next;
}
}
class HashMapDemo<K,V> {
//定义数组长度
private final int SIZE = 16;
//创建结点的表
private Node<K,V> table[] = new Node[SIZE];
//存放数据的方法,存入的值就是键值对
public void put(K k,V v){
//将它变成一个结点
Node<K,V> node = new Node(k,v,null);
//将你的k值跟数组长度取模,得到你的数应该放在数组里的那个索引处
int index = (node.k).hashCode() % (table.length -1);
//在对应索引处判断是否为空,是空最好,直接存放
if (table[index] == null){
table[index] = node;
return;
}else {
//不是则遍历链表,从链表头开始遍历
Node temp = table[index];
while (temp != null){
//要是有一样的k值之后,将它的value值替换,k对象不是基本类型或者String要重写equals和hashcode方法
if (temp.k.equals(node.k)){
System.out.println("这是被覆盖的值:"+ temp.v);
temp.v = node.v;
return;
}
temp = temp.next;
}
//没有k重复则直接放,这是放在了头部,也可以放在尾的,这个遍历起来会先放后遍历
node.next = table[index];
table[index] = node;
}
}
//查看元素
public void view(){
//简单的从数组从第一个链表遍历到最后一个链表
for (int i = 0; i < table.length; i++) {
Node temp = table[i];
while (temp != null){
System.out.println(temp.v);
temp = temp.next;
}
}
}
//取值
public void getValue(K k){
//由k值得到它该存的数组索引位置,遍历链表查找是否有无k值一样,有则输出value,没有则返回失败
int index = k.hashCode() % (table.length -1);
Node temp = table[index];
while (temp != null){
if (temp.k.equals(k)){
System.out.println("这是" + k + "的值:"+ temp.v);
return;
}
temp = temp.next;
}
System.out.println("没有该值!");
}
//删除方法
public void delete(K k){
int index = k.hashCode() % (table.length -1);
//当要删除的是链表的第一个一个结点时,处理方法不一样,利用的依旧是链表的增删改查
if (table[index].k.equals(k)) {
table[index] = table[index].next;
System.out.println("删除成功!");
return;
}
Node temp = table[index];
while (temp.next != null){
if (temp.next.k.equals(k)){
temp.next = temp.next.next;
System.out.println("删除成功!");
return;
}
temp = temp.next;
}
System.out.println("删除失败!");
}
}
//测试程序
public class MyHashpMap {
public static void main(String[] args) {
HashMapDemo hmd = new HashMapDemo();
hmd.put(1,"aa");
hmd.put(2,"bb");
hmd.put(3,"cc");
hmd.view();
System.out.println("==========");
hmd.put(1,"aaa");
hmd.view();
System.out.println("==========");
hmd.put(1,"aa - 1");
hmd.view();
System.out.println("===========");
hmd.put(16,"aa - 2");
hmd.put(31,"aaaa");
hmd.put(46,"aa - 3");
hmd.put(17,"bbb");
hmd.put(32,"bbbb");
hmd.put(47,"bbbbb");
hmd.view();
hmd.getValue(2);
System.out.println("============");
hmd.delete(47);
hmd.delete(2);
hmd.view();
}
}