HashMap底层实现采用了哈希表
package sxt.gaoqi.container;
/*
* put存储键值对
* 解决键重复问题、链表生成问题
* 重写toString方法打印Map内容
* get查找键值对
*/
public class JsHashMap<K,V>
{
Node2[] table; //哈希数组
int size; //存放的键值对的个数
public JsHashMap()
{
table = new Node2[16]; //长度一般定义为2的整数幂
}
public void put(K key, V value)
{
Node2 newNode = new Node2();
newNode.hash = (myHash(key.hashCode(), table.length));
newNode.key = key;
newNode.value = value;
newNode.next = null;
Node2 temp = table[newNode.hash];
Node2 lastNode = null ; //正在遍历的最后一个元素结点
boolean keyRepeat = false; //判断key是否被覆盖
if(temp == null)
{
table[newNode.hash] = newNode;
size++;
// System.out.println(newNode.hash);
}
else
{//此处数组元素不为空,则遍历此链表
while(temp != null)
{
//判断:key如果重复,则覆盖
if(temp.key.equals(key))
{
keyRepeat = true;
temp.value = value; //只是覆盖value即可,其他的值(hash、key、next)不用管
break;
}
else
{
//key不重复,则遍历下一个
lastNode = temp;
temp = temp.next;
}
}
if(!keyRepeat)
{
lastNode.next = newNode;
size++;
}
}
}
public V get(K key)
{
int hash = myHash(key.hashCode(), table.length);
V value = null;
Node2 temp = table[hash];
while(temp != null)
{
if(temp.key.equals(key))
{
value = (V)temp.value;
break;
}
temp = temp.next;
}
return value;
}
public int myHash(int key, int length)
{
// System.out.println("hash in myHash:" + (key&(length-1)));
// System.out.println("hash in myHash:" + (key%(length-1)));
return (key&(length-1));
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder("{");
for(int i = 0; i < table.length; i++)
{
Node2 temp = table[i];
while(temp != null)
{
sb.append(temp.key + ":" + temp.value + ",");
temp = temp.next;
}
}
sb.setCharAt(sb.length() - 1 , '}');
return sb.toString();
}
public static void main(String[] args)
{
JsHashMap<Integer, String> m = new JsHashMap<>();
m.put(1, "ss");
m.put(2, "cc");
m.put(3, "dd");
m.put(53, "森");
m.put(69, "莹");
m.put(85, "宝宝");
System.out.println(m);
System.out.println(m.get(53));
}
}