Map原理分析

来源:互联网 发布:高频交易程序员 编辑:程序博客网 时间:2024/06/05 14:46

看过一些文章有提到面试时,面试官会问道一些关于map的问题,最基础的就是map的用法,只要是开发过程序代码的,肯定会接触到map的用法,仅仅是初级的话,知道map用法也就差不多了,而随着工作年限的增加,就会有想要了解map用法的底层实现。大家知道map是键值对的存储方式,键是不能重复的,也都很清楚map的put,get方法,map的遍历,remove方法等等。我现在就简单的介绍map的get,put方法,不用例子,只用文字来描述。map的get方法转入的参数是键值,对键值的hashcode%初始数组的容量求余,从而找到key所在的linkedList数组的下标,从而找到key所在的链表,遍历链表,用equals方法找到与传入参数相等的key对应value值返回。map的put方法是添加一个组键值对,先通过键值的hashcode%数组的初始值得到linkedList数组的下标值,在判断下这个linkedList[index]是否为空,如果不为空,就遍历这个数组,找到与转入key相同的key,把key对应的的value替换成传入的value,没找到与key相等的key时,就创建一个包含传入key,value的Entry对象,加到这个linkedList[index]链表的后面。如果linkedList[index]为空的,就创建一个链表来放entry对象,并加入linkedList数组中。
package com.huahua.it.collection;
import java.util.Iterator;
import java.util.LinkedList;

public class SaxMap{

int size=0;static int initialCapacity=999;LinkedList[] linkedList=new LinkedList[initialCapacity];public static void main(String[] args) {    SaxMap1 sax=new SaxMap1();    sax.put("111", "aaa");    sax.put("222", "bbb");    sax.put("222", "ccc");    LinkedList[] arr=sax.linkedList;    LinkedList list1=arr["222".hashCode()%initialCapacity];    for(Iterator it=list1.iterator();it.hasNext();){        SaxEntry str=(SaxEntry) it.next();        System.out.println(str.key+":"+str.value);    }    System.out.println(sax.size);}@SuppressWarnings("unchecked")public void put(Object key,Object value){    int a=key.hashCode()%initialCapacity;//不同的键值,hashcode相同,放在相同的位置    SaxEntry s=new SaxEntry(key,value);    if(linkedList[a]!=null){        LinkedList l=(LinkedList) linkedList[a];        for (int i = 0; i < l.size(); i++) {            SaxEntry sax=(SaxEntry)l.get(i);            if(sax.key.equals(key)){                sax.value=value;                return;            }        }        l.add(s);    }else{        LinkedList l=new LinkedList();        l.add(s);        linkedList[a]=l;        size++;    }}public Object get(Object key){    int a=key.hashCode()%initialCapacity;    if(null!=linkedList[a]){        LinkedList l=(LinkedList) linkedList[a];        for (int i = 0; i < l.size(); i++) {            SaxEntry ls=(SaxEntry) l.get(i);            if(ls.key.equals(key)){                return ls.value;            }        }    }    return null;}

}

class SaxEntry{

public Object key;public Object value;public SaxEntry(Object key,Object value){    super();    this.key=key;    this.value=value;}

}

原创粉丝点击