手写HashMap底层(源码)

底层结构:

在手写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 + "]";
	}
}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值