1.使用LinkedList实现HashMap
LinkList是链表数组实现的,这里为了方便直接使用的基于LinkedList的双向链表数组
2.自定义HashMap的功能函数
1)添加元素
public void put(Key key,Value value)
2)根据键获取值
public Value get(Key key)
3)根据键删除键值对
public Value remove(Key key)
4)判断是否包含某键
boolean containsKey(Key key)
3.代码实现:class MyHashMap<Key,Value>
{
int M;
LinkedList<Entry<Key,Value>> arr[]; //LinkedList数组
class Entry<Key,Value>
{
Key key;
Value value;
public Entry(Key key,Value value)
{
this.key = key;
this.value = value;
}
}
public MyHashMap()
{
this(16); //默认的数组长度为16
}
public MyHashMap(int M)
{
this.M = M;
arr = new LinkedList[M];
}
//添加元素
public void put(Key key,Value value)
{
Entry<Key,Value> entry = new Entry<>(key,value);
int i = key.hashCode()%M;
if(arr[i]==null) //这边不是很理解???????
{
LinkedList<Entry<Key,Value>> list = new LinkedList<>();
arr[i] = list;
}
for(int k=0;k<arr[i].size();k++)
{
if(key.equals(arr[i].get(k).key))
{
arr[i].get(k).value = value;
return;
}
}
arr[i].add(entry);
}
//根据键获取值
public Value get(Key key)
{
int i = key.hashCode()%M;
if(arr[i]!=null)
{
for(int k=0;k<arr[i].size();k++)
{
if(arr[i].get(k).key.equals(key))
return arr[i].get(k).value;
}
}
return null;
}
//删除映射关系
public Value remove(Key key)
{
int i = key.hashCode()%M;
if(arr[i]!=null)
{
for(int k=0;k<arr[i].size();k++)
{
if(arr[i].get(k).key.equals(key))
{
Value temp = arr[i].get(k).value; //存储要删除的Entry的value值
arr[i].remove(k);
return temp;
}
}
}
return null;
}
//包含某键值
boolean containsKey(Key key)
{
int i = key.hashCode()%M;
if(arr[i]!=null)
{
for(int k=0;k<arr[i].size();k++)
{
if(arr[i].get(k).key.equals(key))
{
return true;
}
}
}
return false;
}
//输出所有的键值
public void print()
{
for(int i=0;i<arr.length;i++)
{
if(arr[i]!=null) //有的数组为空,这里要判断一下
{
for(int j=0;j<arr[i].size();j++)
{
System.out.print(arr[i].get(j).key+"...."+arr[i].get(j).value);
}
System.out.println();
}
}
System.out.println();
}
}
public class myHashMapByLinkedList
{
public static void main(String[] args)
{
MyHashMap<String,String> map = new MyHashMap<>();
//1添加元素
map.put("xiaohong", "11");
map.put("xiaoming", "13");
map.put("xiaoming", "15");
map.put("haha","1000");
map.print();
//根据键值删除键值对
map.remove("xiaohong");
map.print();
//根据键获取值
System.out.println(map.get("xiaoming"));
//是否含有某键
System.out.println(map.containsKey("xiaoming"));
}
}
1.使用的是链表数组,可以使用LinkedList来实现HashMap(拉链法)
2.从HashMap的实现也可以看出:两个对象的HashCode值相等,两个对象不一定相等,但两个对象相等,那么他们的HashCode的值一定相等。(为了维护,这样的关系,重新写了equals方法,那么必须重新写HashCode方法)
3.加深对数组的理解,对于LinkedList[] a = new LinkedList[10];的理解,创建一个双向链表数组,创建完后内容为空。