JAVA源码分析Collection之Map

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;
	}
	

}


你可能感兴趣的:(JAVA源码分析)