底层结构:
在手写HashMap的时候,需要首先弄清楚HashMap底层结构实现原理。HashMap底层采用哈希表实现,其中哈希表相当于“数组+链表”的结构。其结构示意图如下:
采用哈希表实现HashMap的时候,需要首先弄清楚其存储流程。首先创建Entry节点的结构,并且创建指定长度的数组;其次根据哈希函数计算的哈希值确定节点在数组中的存储位置,最后判断数组指定位置是否已有其他节点,并在链表的尾部添加新的节点。其存储流程示意图如下:
源码:
Entry类:
package cn.csu.hashmap;
public class Entry {
private int hash;
private Object key;
private Object value;
private Entry next;
public Entry() {
}
public Entry(int hash, Object key, Object value, Entry next) {
super();
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
public int getHash() {
return hash;
}
public void setHash(int hash) {
this.hash = hash;
}
public Object getKey() {
return key;
}
public void setKey(Object key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Entry getNext() {
return next;
}
public void setNext(Entry next) {
this.next = next;
}
}
MyHashMap类:
package cn.csu.hashmap;
public class MyHashMap {
public static final int Array_Count=16;
private Entry [] my_Array=new Entry [Array_Count];
//哈希函数
private int getHash(int hash){
return hash%Array_Count;
}
//存放键值对
public void add(Object key,Object value){
int hash=this.getHash(key.hashCode());
Entry entry=new Entry();
entry.setHash(hash);
entry.setKey(key);
entry.setValue(value);
entry.setNext(null);
//若数组的第一个位置为空,则直接将节点放入
if(my_Array[hash]==null){
my_Array[hash]=entry;
}
//若数组的第一个位置不为空,则循环查找直到链表next指针为空的位置,放入该节点
else{
Entry entry_last=my_Array[hash];
while(entry_last.getNext()!=null){
entry_last=entry_last.getNext();
}
entry_last.setNext(entry);
}
}
//根据key,查找value
public Object get(Object key){
int hash=this.getHash(key.hashCode());
if(my_Array[hash]==null){
System.out.println("查找的key值不存在!!!");
return null;
}else{
Entry index=my_Array[hash];
while(index.getKey()!=key){
index=index.getNext();
}
return index.getValue();
}
}
public static void main(String[] args) {
Student student1 =new Student();
student1.setSname("张三");
student1.setSage(33);
student1.setSgender("男");
student1.setGrade(88.88);
Student student2 =new Student();
student2.setSname("李四");
student2.setSage(22);
student2.setSgender("男");
student2.setGrade(84.88);
Student student3 =new Student();
student3.setSname("王五");
student3.setSage(18);
student3.setSgender("男");
student3.setGrade(48.88);
MyHashMap myHashMap=new MyHashMap();
myHashMap.add(1, student1);
myHashMap.add(2, student2);
myHashMap.add(3, student3);
Object value=myHashMap.get(1);
System.out.println(value);
}
}
Student类:
package cn.csu.hashmap;
public class Student {
private String sname;
private int sage;
private String sgender;
private double grade;
public Student() {
}
public Student(String sname, int sage, String sgender, double grade) {
super();
this.sname = sname;
this.sage = sage;
this.sgender = sgender;
this.grade = grade;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
public String getSgender() {
return sgender;
}
public void setSgender(String sgender) {
this.sgender = sgender;
}
public double getGrade() {
return grade;
}
public void setGrade(double grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Student [sname=" + sname + ", sage=" + sage + ", sgender=" + sgender + ", grade=" + grade + "]";
}
}