黑马程序员技术交流社区
标题:
自己实现Map接口简单方法<升级版>
[打印本页]
作者:
My_Android
时间:
2016-5-26 09:39
标题:
自己实现Map接口简单方法<升级版>
升级版功能:
1:提高查询效率。如何提高?
通过获得key.hashCode()来获得对象的散列码,即对象的地址。
在对散列码进行%数组的长度。
添加元素的时候只需要获得取完数的大小,添加到相应的下标的位置。
取出元素的时候获得%的大小,拿出相应下标的位置。
弊端:
效率提高了。%完之后的大小,可能会有相同的数值,会造成数据的丢失。
如何解决?
用链表来解决。Map的底层是<数组+链表>来实现的。数组放的不再是一个对象,而是一个链表。链表是有一个节点构成的。节点里的值就存放key,value 对象。
import java.util.LinkedList;
/**
* 自定义Map实现升级版
* 1:提高查询效率
* @author hasee
*
*/
public class SxtMap002 {
LinkedList[] arr = new LinkedList[999]; //map底层实现数组+链表
int size;
public void put(Object key,Object value){
//创建一个键值对对象
SxtEntry e = new SxtEntry(key,value);
//获得key对象地址%数组的长度
int a = key.hashCode()%arr.length;
/**
* 如果 arr[a]==null 代表没有链表对象,
*/
if(arr[a] == null){
//新建一个链表对象
LinkedList list = new LinkedList();
//往链表容器添加数据
list.add(e);
//把链表赋值给链表数组
arr[a] = list;
}else{
/**
* 不等于空,遍历key对象地址%数组的长度数组链表,如果链表存在相同key,则覆盖
*/
for(int i=0;i<arr[a].size();i++){
SxtEntry e2 = (SxtEntry) arr[a].get(i); //链表添加进去是什么类型,取出来需要强制转型
if(e.key.equals(key)){
e2.value = value;
return ; //键值重复 覆盖
}
}
/**
* for循环没执行,代表key不相同,不相同直接往链表在添加一个数据
*/
arr[a].add(e);
}
size++;
}
public Object get(Object key){
int a = key.hashCode()%arr.length;
/**
* 如果等于==null,代表没有链表,不需要遍历,直接返回空
* 不都于需要遍历链表的存放的元素,如果有相等的key,则返回对应的value
*/
if(arr[a] != null){
for(int i=0;i<arr[a].size();i++){
SxtEntry e = (SxtEntry) arr[a].get(i);
if(e.key.equals(key)){
return e.value;
}
}
}
return null;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2