java【模拟MAP的底层实现】

1.1数组我们无论是C、Java都会学过:

数组是一种连续存储线性结构,元素类型相同,大小相等

数组

数组的优点:

存取速度快

数组的缺点:

事先必须知道数组的长度
插入删除元素很慢
空间通常是有限制的
需要大块连续的内存块
插入删除元素的效率很低

2.1链表说明

看完了数组,回到我们的链表:

链表是离散存储线性结构
n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。
链表

链表优点:

空间没有限制
插入删除元素很快
链表缺点:

读取速度很慢,复杂度是O(n)

这里重点不是说数组和单向链表的区别,目的是自己代码实现map存储,因此关于数组和链表见下面的博客:
https://www.cnblogs.com/Java3y/p/8664874.html

下面是源代码

package com.bjsxt;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

public class MyMap {
	static int instiallSize=10;
	static Object[] arr=new Object[instiallSize];
	static int size=0;
	
	/****
	 * 
	
	* @Title: addEntry
	
	* @Description: TODO(这里用一句话描述这个方法的作用)
	
	* @param @param key
	* @param @param value    设定文件
	
	* @return void    返回类型
	
	* @throws
	 */
	public static void addEntry(String key,String value){
		if(StringUtils.isEmpty(value.toString())){
			return;
		}
		SxtEntry x=new SxtEntry(key,value);
		if(arr.length==size){//扩容
			arr=Arrays.copyOf(arr, arr.length+instiallSize);	
			System.out.println("扩容成功,数组大小为"+arr.length);
		}
		int jsSize=key.hashCode()%arr.length;//对这个取模
		
		if(arr[jsSize]!=null){
			//不等于空就取出列表,将对象加入进去即可
			LinkedList<SxtEntry> linkList= (LinkedList<SxtEntry>) arr[jsSize];
			linkList.add(x);
			arr[jsSize]=linkList;
		}else{
			//等于空,则创建链表
			LinkedList<SxtEntry> list=new LinkedList<SxtEntry>();
			list.add(x);
			arr[jsSize]=list;
		}
		size++;
	}
	
	/***
	 * 
	
	* @Title: removeEntry
	
	* @Description: TODO(这里用一句话描述这个方法的作用)
	
	* @param @param key
	* @param @return    设定文件
	
	* @return SxtEntry    返回类型
	
	* @throws
	 */
	public static SxtEntry removeEntry(String key){
		int jsSize=key.hashCode()%arr.length;
		if(arr[jsSize]==null){
			//如果没有找到,则返回null,剔除失败
			return null;
		}else{
			LinkedList<SxtEntry> linkList= (LinkedList<SxtEntry>) arr[jsSize];
			for(SxtEntry sxt:linkList){
				if(sxt.key.equals(key)){
					//如果遇到,就干掉它
					linkList.remove(sxt);
				}
			}
			return null;
		}
	}
	
	public static SxtEntry getEntry(String key){
		int jsSize=key.hashCode()%arr.length;
		if(arr[jsSize]==null){
			//如果没有找到,则返回null,剔除失败
			return null;
		}else{
			LinkedList<SxtEntry> linkList= (LinkedList<SxtEntry>) arr[jsSize];
			for(SxtEntry sxt:linkList){
				if(sxt.key.equals(key)){
					//如果遇到,就返回这个对象
					return sxt;
				}
			}
			return null;
		}
	}
	
	
	
	public static void main(String[] args){
		
		//第一步放入对象,现在放入了20个对象
		for (int i=0;i<10;i++){
			addEntry("x"+i,"vvvv"+i);
		}
		for (int i=0;i<10;i++){
			//这时候就去扩容了
			addEntry("x==>"+i,"vvvv==>"+i);
			
			//addEntry("x==>"+i,"vvvv-->"+i);
		}
		
		//Object[] arr=new Object[instiallSize];
		System.out.println("map数组的大小为"+arr.length);
		//遍历map,取出里面所有的对象
		for(Object ls:arr){
			if(ls!=null){
				LinkedList<SxtEntry> list=(LinkedList<SxtEntry>)ls;
				for(SxtEntry sxt:list){
					if(sxt!=null){
						System.out.println(sxt.toString());
					}
				}
			}
		}
		
	
		//第二步传入key值得到对象
		SxtEntry entry=getEntry("x==>0");
		String s1=entry==null?null:entry.value;
		System.out.println("得到的value="+s1);
		
		
		//第三部,剔除key
		
		removeEntry("x==>0");
		SxtEntry entry2=getEntry("x==>0");
		String s2=(null==entry2?"":entry2.value);
		System.out.println("的到的value2="+s2);
		
		
		
		
	}
}

class SxtEntry{
	String key;
	String value;
	public SxtEntry(String key,String value){
		this.key=key;
		this.value=value;
	}
	@Override
	public String toString() {
		return "SxtEntry [key=" + key + ", value=" + value + "]";
	}
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	
	
}

励志语:越长大越明白一句真理:机会是留给有准备的人的

V:18612372242 欢迎学习交流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知乎关注八戒来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值