JAVA学习笔记31——Map接口+Map常见方法+模拟实现Map(低级版和高级版)

最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习。

本篇讲述四个内容。

第一个内容是介绍一下容器中一个很重要的接口:Map接口


第二个内容是Map的常见方法——get、put、containsKey、containsValue的示例代码:

import java.util.HashMap;
import java.util.Map;

/**
 * 测试Map的基本用法
 */
public class TestMap {
	public static void main(String[] args) {
		Map map = new HashMap();
		map.put("高", new Wife("张曼玉"));  //实现key—value的对应
		map.put("张三", new Wife("杨幂"));
		Wife w = (Wife) map.get("高");         //通过key来找value,结果要强制转型
//		map.remove("高琪");    //会把一对数据全删掉(从容器中剔除但是不是彻底删除)
//		map.containsKey("张三");   //检测HasMap容器里面有没有该key
		System.out.println(w.name); 
	}
}
class Wife {
	String name;
	public Wife(String name){
	this.name  = name;
	}
}
第三个内容是实现一个低级版的HashMap:

/**
 *自定义实现Map的功能!
 *暂不完美! 
 *Map:存放键值对,根据键对象找对应的值对象.键不能重复!
 */
public class SxtMap001 {
	SxtEntry[]  arr  = new SxtEntry[990];
	int size;
	public void put(Object key,Object value){
		SxtEntry e = new SxtEntry(key,value);
		//解决键值重复的处理
		for(int i=0;i<size;i++){
			if(arr[i].key.equals(key)){
				arr[i].value=value;   //用新的value值去覆盖老的value值
				return ;
			}
		}
		arr[size++] = e;
	}
	public Object get(Object key){
		for(int i=0;i<size;i++){
			if(arr[i].key.equals(key)){
				return arr[i].value;   //找到了就此停止该方法的执行,返回相应value
			}
		}
		return null;   //没有找到就返回null
	}
	public boolean containsKey(Object key){
		for(int i=0;i<size;i++){
			if(arr[i].key.equals(key)){
				return true;
			}
		}
		return false;
	}
	public boolean containsValue(Object value){
		for(int i=0;i<size;i++){
			if(arr[i].value.equals(value)){
				return true;
			}
		}
		return false;
	}
	public static void main(String[] args) {
		SxtMap001 m = new SxtMap001();
		m.put("高琪", new Wife("杨幂"));
		m.put("高琪", new Wife("李四"));
		Wife w = (Wife) m.get("高琪");
		System.out.println(w.name); 
	}
}

class  SxtEntry {
	Object key;
	Object value;
	public SxtEntry(Object key, Object value) {
		super();
		this.key = key;
		this.value = value;
	}	
}
从上面的代码可以看出, 实现SexMap001,效率较低(设计多个for循环的遍历,元素多了后效率大幅度降低)。

第四个内容是介绍升级版SexMap002,它采用Hash检索结构,减少遍历的次数,提高了效率,具体细节方面的解释已经添加到了代码的注释部分:

import java.util.LinkedList;
/**
 * 自定义Map的升级版(大容器套小容器):
 * 1. 提高查询的效率
 */
public class SxtMap002 {
	LinkedList[]  arr  = new LinkedList[9]; //****Map的底层结构就是:数组+链表,每个数组的元素对应一组拥有同一个Hash值的SxtEntry对象(即该容器里面最小单位的组件)的集合,对于拥有同一个Hash值(即key相同)的元素,这样的一组对象用一个链表再串起来,看起来就像是大容器套小容器,小容器里面装着组件。
	int size;	
	public void put(Object key,Object value){
		SxtEntry  e = new SxtEntry(key,value);   //用构造器构造出这样一个元素(对象)
		int hash = key.hashCode();
		hash = hash<0?-hash:hash;
		int a = hash%arr.length;   //求余得到一个键值
		if(arr[a]==null){
			LinkedList list = new LinkedList();    
			arr[a] = list;  //在该数组元素下建立一个链表
			list.add(e);
		}else{
			LinkedList list = arr[a];   //如果该数组下已经建立了一个链表,那么先把这个链表提取出来进行操作
			for(int i=0;i<list.size();i++){
				SxtEntry e2 = (SxtEntry) list.get(i);   //利用LinkedList的get方法取得第i个结点,然后强制转型为SexEntry类型,如果发生了键值重复则直接覆盖
				if(e2.key.equals(key)){
					e2.value = value;  //键值重复直接覆盖!
					return;
				}
			}
			arr[a].add(e);//如果没有则直接调用LinkedList的add方法添加到该链表之后即可
		}
		//a:1000-->1   b:10000-->13
	}
	public Object get(Object key){
		int a = key.hashCode()%arr.length;
		if(arr[a]!=null){
			LinkedList list = arr[a];
			for(int i=0;i<list.size();i++){
				SxtEntry e = (SxtEntry) list.get(i);
				if(e.key.equals(key)){
					return e.value;
				}
			}
		}
		return null;
	}
	public static void main(String[] args) {
		SxtMap002 m = new SxtMap002();
		m.put("高琪", new Wife("杨幂"));
		m.put("高琪", new Wife("李四"));
		Wife w = (Wife) m.get("高琪");
		System.out.println(w.name); 
	}
}
class  SxtEntry {
	Object key;
	Object value;
	public SxtEntry(Object key, Object value) {
		super();
		this.key = key;
		this.value = value;
	}	
}
好了,本篇到此结束~




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值