欢迎来到天天文库
浏览记录
ID:30899462
大小:294.50 KB
页数:18页
时间:2019-01-04
《给jdk写注释系列之jdk16容器(4)-hashmap源码解析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、给jdk写注释系列Zjdkl.6容器⑷-HashMap源码解析-Java开发Java经验技巧给jdk写注释系列之jdkl.6容器(4)-HashMap源码解析原乂出处:吞噬天谄本系列:给jdk写注释系列之jdkl.6容器(1)-ArrayList源码解析给jdk写注释系列之jdkl.6容器(2)-LinkedList源码解析给jdk写注释系列之jdkl.6容器(3):Iterator设计模式前而了解了jdk容器屮的两种List,回忆一下怎么从list屮取值(也就是做查询),是通过index索引位置
2、对不对,由于存入list的元素时安装插入顺序存储的,所以index索引也就是插入的次序。Map呢是这样一种容器,它可以存储两个元素键和值,根据键这个关键字可以明确且唯一的查出一•个值,这个过程很像查字典,考虑一下使用什么样的数据结构才能实现这种效果呢?1.自己实现一个Map?先來看一下jdk中map的定义:publicintcrfaccMap{intsize();booleanisEmpty();booleancontainsKey(Objectkey);booleancontainsV
3、alue(Objectvalue);Vget(Objectkey);Vput(Kkey,Vvalue);Vremove(Objectkey);voidputAll(Mapm);voidclear();SctkcySct();Collectionvalues();Set>entrySet();interfaceEntry{VgetValueO;VsctValue(Vvalue);booleanequals
4、(Objecto);inthashCode();booleanequals(Objecto);inthashCode();}可以看到Map并没有实现Collection接口,也没有实现List接口,因为它可以保存两个属性key-value,和List容器一样还是包含增删改查等棊木操作,同时可以看到Map中还定义了一个用來表示键值K-V的接口Entryo在了解了map的概念和定义后,首先我们自己先来简单写一个Map的实现,看看会遇到什么样的问题。publicclassMyMap{privateEnt
5、ry[]data二newEntry[100];privateintsize;publicObjectput(Objectkey,Objectvalue){//检查key是否存在,存在则覆盖for(inti二0;i6、size++;rcturnnull;}publicObjectget(Objectkey){for(inti二0;i7、ue二value;}上面我们简单实现了一下map的put、get、size等方法,从代码可以看到底层是使用数纟R来存储数据的。测试一下上面的方法:publicclassTest{publicstaticvoidmain(String[]args){MyMeipmap=newMyMeipO;map.put("tstcT,,zangelababy,z);map.put(〃张三",〃李四“);map.put(〃tstd〃,〃高圆圆〃);System・out・printin(map・sizcO);Syst8、em・out・printin(map・get(〃tstd〃));System,out.printin(map.get("张三〃));}看下结果:高圆圆李四结果好像是没有问题的对不对。但是这么简单嘛?我们来看一下上面的代码存在一些什么样的问题。观察代码可以看到,get方法中,通过key获1Rvalue的方式是通过遍历数组实现,这样显然是非常低效的,同样在put方法中由于耍检査key是否已经存在也是通过遍历数组实现,想一下有没有更好的办法呢?能不能像数组那样肓接通过下标就可以取得对应的
6、size++;rcturnnull;}publicObjectget(Objectkey){for(inti二0;i7、ue二value;}上面我们简单实现了一下map的put、get、size等方法,从代码可以看到底层是使用数纟R来存储数据的。测试一下上面的方法:publicclassTest{publicstaticvoidmain(String[]args){MyMeipmap=newMyMeipO;map.put("tstcT,,zangelababy,z);map.put(〃张三",〃李四“);map.put(〃tstd〃,〃高圆圆〃);System・out・printin(map・sizcO);Syst8、em・out・printin(map・get(〃tstd〃));System,out.printin(map.get("张三〃));}看下结果:高圆圆李四结果好像是没有问题的对不对。但是这么简单嘛?我们来看一下上面的代码存在一些什么样的问题。观察代码可以看到,get方法中,通过key获1Rvalue的方式是通过遍历数组实现,这样显然是非常低效的,同样在put方法中由于耍检査key是否已经存在也是通过遍历数组实现,想一下有没有更好的办法呢?能不能像数组那样肓接通过下标就可以取得对应的
7、ue二value;}上面我们简单实现了一下map的put、get、size等方法,从代码可以看到底层是使用数纟R来存储数据的。测试一下上面的方法:publicclassTest{publicstaticvoidmain(String[]args){MyMeipmap=newMyMeipO;map.put("tstcT,,zangelababy,z);map.put(〃张三",〃李四“);map.put(〃tstd〃,〃高圆圆〃);System・out・printin(map・sizcO);Syst
8、em・out・printin(map・get(〃tstd〃));System,out.printin(map.get("张三〃));}看下结果:高圆圆李四结果好像是没有问题的对不对。但是这么简单嘛?我们来看一下上面的代码存在一些什么样的问题。观察代码可以看到,get方法中,通过key获1Rvalue的方式是通过遍历数组实现,这样显然是非常低效的,同样在put方法中由于耍检査key是否已经存在也是通过遍历数组实现,想一下有没有更好的办法呢?能不能像数组那样肓接通过下标就可以取得对应的
此文档下载收益归作者所有