看过一些文章有提到面试时,面试官会问道一些关于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;
}
}