HashMap是基于哈希散列表实现,通过映射关系存储对象即key-value,并且key值不能具有重复的对象,因为假如具有相同的对象我们在调用get方法的时候不知道得到那个对象所对应的值。又因为如果想要实现key不能够重复我们就需要遍历map中的key值找到对应的entry对象修改value值。这就代表着需要大量的损耗来进行相关的遍历。所以jdk采用数组+链表实现。我们将对象存储在链表数组中。将key的hashcode码对数组的长度进行取余。并将余数作为数组的下标,然后遍历这个数组下标所以对应的链表。查看是否具有相关的key值,如果存在则直接覆盖,如果不存在则直接通过add方法添加。其相关实现如下:
public class MyHashMap {
LinkedList[] lists=new LinkedList[999];
public void add(Object key,Object value) {
MyEntry entry=new MyEntry();
entry.setKey(key);
entry.setValue(value);
int a=key.hashCode()%lists.length;
System.out.println(a);
if(lists[a]==null) {
lists[a]=new LinkedList<>();
lists[a].add(entry);
return ;
}
else {
for(int i=0;i<lists[a].size();i++) {
if(((MyEntry)lists[a].get(i)).getKey().equals(key)) {
((MyEntry)lists[a].get(i)).setValue(value);
return;
}
}
}
lists[a].add(entry);
}
public Object get(Object key) {
int a=key.hashCode()%lists.length;
for(int i=0;i<lists[a].size();i++) {
if(((MyEntry)lists[a].get(i)).getKey().equals(key)) {
return ((MyEntry)lists[a].get(i)).getValue();
}
}
return null;
}
public Object remove(Object key) {
int a=key.hashCode()%lists.length;
for(int i=0;i<lists[a].size();i++) {
if(((MyEntry)lists[a].get(i)).getKey().equals(key)) {
Object oldvalue=((MyEntry)lists[a].get(i)).getValue();
List list= lists[a];
list.remove(i);
return oldvalue;
}
}
return null;
}
}
当然这是简易版本的哈希map,jdk中遍历采用迭代器。具体看迭代器那篇。