您的位置:首页 > 编程语言 > Java开发

JAVA源码分析Collection之Map

2017-01-25 19:59 447 查看
Map的底层实现:LinkedList数组,一个非常大的数组,LinkedList中存储的是MyEntry对象(包括key和value属性的对象),因为要保证map中的查询速度比较快,是基于散列算法来实现的,散列的主要实现是依靠hashcode方法。hashcode的产生是基于,内存地址产生的,保证产生的每一个hashcode都是唯一的,其实这种算法有点类似于桶排序。就是一种牺牲空间,从而来换取时间的算法。

MyEntry类主要是一个key、value的对象package com.xl.realizeMap;

public class MyEntry {

private Object key;
private Object value;
public Object getKey() {
return key;
}
public void setKey(Object key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}

}
HashMap类的put和get方法
package com.xl.realizeMap;

import com.xl.realizeLinkedList.XLLinkedList;

public class XLMap {

//开始定义一个非常大的LinkedList数组
XLLinkedList[] list = new XLLinkedList[999];
/**
* put(Object key,Object value)根据键和值来新增对象
* 实现的主要思想:
* 1、根据key来产生一个hashcode
* 2、对产生的hashcode进行取余,保证产生的index在数组范围内
* 3、将对应的value存储到index对应的LinkedList数组中
* 4、当,进行取值的时候,先根据key来产生一个hashcode,因为如果key相同
* 产生的hashcode也是一样的
* 5、如果,LinkedList中有多个元素的时候,使用equals方法进行查找到
* 对应的key,从而得到value
*
*/
public void put(Object key,Object value){
MyEntry myEntry = new MyEntry();
myEntry.setKey(key);
myEntry.setValue(value);
//根据key来计算hashcode,因为hashcode有可能为负数
//所以,如果计算出来的hashcode为负数的话要进行取反
int code = key.hashCode() < 0 ? -key.hashCode() : key.hashCode();
//index为根据key产生的hashcode根据数组的长度来取余,
//取余的目的:保证产生的index在数组的范围内,不会导致数组越界异常
int index = code%list.length;
//如果,新增的元素为第一个,初始化LinkedList
if(list[index] == null){
XLLinkedList linkedList = new XLLinkedList();
linkedList.add(myEntry);
list[index] = linkedList;
}else{
for(int i = 0;i < list[index].size();i++){
MyEntry temp = (MyEntry) list[index].get(i);
//判断是否为同一个key,如果是则进行覆盖值
if(temp.getKey().equals(key)){
temp.setValue(value);
return;
}
}
//如果,新增的元素原来的LinkedList中没有,则直接添加
list[index].add(myEntry);
}
}

/**
* get(Object key)根据key来得到value
*/
public Object get(Object key){
//采用与put中相同的算法来获取index
int index = key.hashCode()%list.length;
if(list[index] != null){
XLLinkedList xlList = list[index];
for(int i = 0;i < xlList.size();i++){
MyEntry entry = (MyEntry) xlList.get(i);
if(entry.getKey().equals(key)){
return entry.getValue();
}
}
}
return null;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: