手动实现HashMap的put和get方法
HashMap的底层数据结构是数组+链表组成的,所以手动的去模拟一下 先定义Entry类,这里直接使用@Data注解
@Data
public class Entry{
public String key;
public Object value;
}
然后定义一个DiyHashMap类
public class DiyHashMap{
private static ArrayList<LinkedList<Entry>> arraylist=new ArrayList<>();
public HashMapTest() {
for (int i = 0; i < 2000; i++) {
arrayList.add(i, null);
}
}
public void put(String key,Object value){
Entry entry=new Entry();
int hascode=key.hashCode();
LinkedList<Entry> entries = arrayList.get(hashCode);
if (entries == null) {
entries = new LinkedList<>();
arrayList.set(hashCode, entries);
entries.add(entry);
} else {
boolean resoult = false;
for (int i = 0; i < entries.size(); i++) {
if (entry.key.equals(entries.get(i).key)) {
entries.get(i).value = entry.value;
resoult = true;
}
}
if (!resoult) {
entries.add(entry);
}
}
}
public Object get(String key) {
Object value = null;
int hashCode = key.hashCode();
LinkedList<Entry> entries = arrayList.get(hashCode);
if (entries == null) {
return value;
} else {
for (Entry e :
entries) {
if (e.key.equals(key)) {
value = e.value;
}
}
}
return value;
}
}
大概的思路流程就是先定义一个ArrayList<LinkedList>,符合hashMap的数组+链表的结构,然后在put方法中,先生成key对应的hashcode,找到对应的链表,是否为空,空的话就直接插入,如果key值相同的话,就直接覆盖value,不相同的话就直接插入。 get方法的判断也基本相同,先通过key生成hashcode,找到对应的链表,如果链表为null,直接返回当前对象的value,否则,就遍历这个链表,然后通过equal方法确保是同一个对象。返回value即可。 HashMap的hash冲突越少,查询的速度就越快,如果我们要使用自己自定义的类作为key的时候,必须重写hashCode()和equals方法。
|