自己手动写一个HashMap
数据结果与算法绪论
Map接口
public interface Map<K,V> {
V put(K k, V v);
V get(K k);
int size();
interface Entry<K,V>{
K getKey();
V getValue();
}
}
HashMap实现类
public class HashMap<K,V> implements Map<K,V> {
private Entry<K,V> table[] = null;
int size = 0;
public HashMap(){
table = new Entry[16];
}
/**
* 通过key 进行hash
* index下表数组 当前数组对应的对象Entry
* 判断当前这个对象为空 如果是空的,直接可以存储数据,如果不为空,就是hash冲突,所以要用链表,然后返回这个存储结果
* @param k
* @param v
* @return
*/
@Override
public V put(K k, V v) {
int index = hash(k);
Entry<K,V> entry = table[index];
if(entry == null){
table[index] = new Entry<>(k,v,index,null);
size ++ ;
}else{
table[index] = new Entry<>(k,v,index,entry);
}
return (V)table[index].getValue();
}
private int hash(K k) {
int i = k.hashCode() % 16;
return i>=0?i:-i;
}
/**
* 通过key进行hash
* 找到数组的下标index
* 找到Entry对象 是否为空
* 如果为空 直接返回 没有找到
* 如果不为空 然后判断k和当前对象的key是否相等
* 如果不相等 不是它 然后在判断next是否为空
* 如果不为空 在进行比较key值 直到相等 才返回 或者返回null
* @param k
* @return
*/
@Override
public V get(K k) {
if(size==0){
return null;
}
int index = hash(k);
Entry<K,V> entry = findValue(table[index],k);
return entry == null?null : (V)entry.getValue();
}
private Entry<K,V> findValue(Entry<K,V> kvEntry, K k) {
if(k.equals(kvEntry.getKey())||k == kvEntry.getKey()){
return kvEntry;
}else{
if(kvEntry.next!=null){
return findValue(kvEntry.next,k);
}
}
return null;
}
@Override
public int size() {
return size;
}
class Entry<K,V> implements Map.Entry<K,V>{
K k;
V v;
int hash;
Entry<K,V> next;
public Entry(K k, V v, int hash, Entry<K, V> next) {
this.k = k;
this.v = v;
this.hash = hash;
this.next = next;
}
@Override
public K getKey() {
return k;
}
@Override
public V getValue() {
return v;
}
}
}
测试
public class Test {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("test","test222");
System.out.println("test的value值为:" + map.get("test"));
}
}
作者:樊同学
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2021-03-17 Java程序使用IDEA编辑器如何生成exe可执行文件