JAVA源码分析Collection之Map

来源:互联网 发布:我想开个网络棋牌室 编辑:程序博客网 时间:2024/06/05 10:15

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;//如果,新增的元素为第一个,初始化LinkedListif(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中相同的算法来获取indexint 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;}}


0 0
原创粉丝点击