Java Map底层实现思路
来源:程序员人生 发布时间:2015-08-24 08:07:04 阅读次数:3811次
<pre name="code" class="java">package cn.com.commsoft.map;
/**
*
* @author wengle
*Java中规定,两个内容相同的对象
*(指的是通过调用equals方法返回true的对象),应当具有相等的hashcode
*1、上面的话,相当于equals返回true的两个对象,就具有相同的hashcode,
*但是具有相同hashcode的对象,通过调用equals方法不1定返回true(Map就是1个例子)
*2、重写了equals方法,就必须重写hashcode方法,为了保证上面的Java规定
*/
public class MyMap {
MyEntry[] arr = new MyEntry[100];
int size;
/**
* 采取hash算法实现map,(每一个对象都有1个地址,
* 根据地址生成的1个hash码,由于每一个对象的地址都不1样,所以
* 生成的hash码是唯1的)
* @param key
* @param value
*/
public void put(Object key, Object value){
MyEntry my = new MyEntry(key, value);
//相当于地址映照函数,但是会产生地址映照冲突
int a = (key.hashCode()%100);
//思路1:当地址冲突时,采取开放地址法处理冲突
while(arr[a].key != null){
a++;
}
arr[a] = my;
/*思路2:当地址冲突时,采取链表法处理冲突-->这也是Java采取的设计思想,
数组加链表(即每一个数组元素里面放1个链表)*/
//第1步:申请1个每一个元素是链表的数组
MapLinkedList[] map = new MapLinkedList[999];
//第2步:添加元素
if(map[a] == null){
MapLinkedList list = new MapLinkedList();
list.add(e);
map[a] = list;
}else{
map[a].add(e);
}
}
public Object get(Object key){
int a = (key.hashCode()%100);
return arr[a].value;
}
}
class MyEntry{
Object key;
Object value;
public MyEntry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
}
内容还会继续更新,敬请关注!
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠