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;}
}
- map reduce原理分析
- Map原理分析
- 容器Map和HashMap底层原理分析
- ruby map迭代简洁写法实现原理分析
- Map分析
- flex map 切片原理
- java map实现原理
- Map-Reduce原理
- Map-Reduce原理
- Map/reduce原理
- Map/Reduce原理深入浅出
- Hadoop Map/Reduce 原理
- Map/Reduce原理
- Map-Reduce原理详解
- Hash Map 工作原理
- map/reduce工作原理
- Map-Reduce原理
- map实现原理-很重要
- ubuntu下postgreSQL9.6安装配置
- oracle、mysql、PostgreSQL有关时间查询和时间切割
- 第一章-1.5.1节
- 【软件工程考研】考研准备第一个月tag
- jdbc-jpa
- Map原理分析
- 1040. 有几个PAT(25)
- sql 数字转换为字符
- SQL查询语句题目(二)
- NoSQL文档型数据库之MongoDb的配置与使用
- 2017.10.1 蚯蚓 思考记录
- JVM (PART VI)垃圾收集算法
- typecho安装后登录失败报错 405 Not Allowed nginx/1.10.2
- kuangbin带你飞:专题一 简单搜索 L