博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写hashmap
阅读量:6902 次
发布时间:2019-06-27

本文共 3675 字,大约阅读时间需要 12 分钟。

hot3.png

定义一个map接口

/** * Created by jiangcaijun on 2017/6/8. * 定义一个map的接口 */public interface CustomMap
{ V put(K key,V value); V get (K key); int size(); //定义一个内部接口 //可以根据Entry对象拿到这个对象的key和value interface Entry
{ K getKey(); V getValue(); }}

hashmap类,实现该map接口

/** * Created by jiangcaijun on 2017/6/8. * 定义一个customMap的实现类 */public class CustomHashMap
implements CustomMap
{ private static Integer defaultLength = 16;//定义数组长度(定义成2的倍数) private static float defaultLoad=0.75F;//定义负载因子(超过这个因子就会扩容) private Entry
[] table =null;//定一个数组,盛放Entry对象 private int size=0;//定义一个常量,用来记录hashmap元素个数 public CustomHashMap(){ this(defaultLength,defaultLoad); } public CustomHashMap(int length, float load){ if(length < 0){ throw new IllegalArgumentException("Illegal length" + length); } if(load > 0.0F && !Float.isNaN(load)) { this.defaultLoad = load; this.defaultLength = length; table = new Entry[defaultLength]; } else { throw new IllegalArgumentException("Illegal load: " + load); } } @Override public V put(K key, V value) { int index = getIndex(key,table.length); Entry
entry = table[index]; if(entry == null){ table[index] = new Entry(key,value,null,index); }else if(entry != null){ table[index] = new Entry(key,value,entry,index); } size++; if(size > defaultLength*defaultLoad){ resize(); } return table[index].getValue(); } @Override public V get(K key) { int index = getIndex(key,table.length); if(table[index] == null){ return null; } return foundValueByKey(key,table[index]); } private V foundValueByKey(K key, Entry
entry) { if( key == entry.getKey() || key.equals(entry.getKey())){ return entry.getValue(); }else if(entry.next != null){ return foundValueByKey(key,entry.next); } return null; } @Override public int size() { return this.size; } class Entry
implements CustomMap.Entry
{ K key; V value; Entry
next; int index;//记录下标 Entry(K k,V v,Entry
n,int inx){ key=k; value=v; index=inx; next=n;//数组第一个元素的下一个元素 } public K getKey(){ return key; } public V getValue(){ return value; } } private int getIndex(K key, int length){ int m = length -1 ; return key.hashCode() & m; //数值上等于key.hashCode() % length } //hashmap扩容 private void resize() { Entry
[] newTable = new Entry[2*defaultLength]; transfer(newTable); } private void transfer(Entry
[] newTable) { System.out.println("transfer 扩容"); Entry[] src = table; //src引用了旧的Entry数组 int newCapacity = newTable.length; for (int j = 0; j < src.length; j++) { //遍历旧的Entry数组 Entry
e = src[j]; //取得旧Entry数组的每个元素 if (e != null) { src[j] = null;//释放旧Entry数组的对象引用(for循环后,旧的Entry数组不再引用任何对象) do { Entry
next = e.next; int i = getIndex(e.key, newCapacity); //重新计算每个元素在数组中的位置 e.next = newTable[i]; //newTable[i]的引用赋给了e.next,也就是使用了单链表的头插入方式,同一位置上新元素总会被放在链表的头部位置;这样先放在一个索引上的元素终会被放到Entry链的尾部(如果发生了hash冲突的话); newTable[i] = e; //将元素放在数组上 e = next; //访问下一个Entry链上的元素 } while (e != null); } } table = newTable; defaultLength = 2*defaultLength; //更新数组长度 } public static void main (String[] args){ CustomHashMap
map = new CustomHashMap
(); for(int i = 0; i < 100; i++){ map.put(i+"",i+""); } for(int i = 0; i < 100; i++){ System.out.println("map取值: "+ i + " = "+map.get(i+"")); } }}

参考链接:

转载于:https://my.oschina.net/u/3136014/blog/1377261

你可能感兴趣的文章
我的友情链接
查看>>
Seliux安全配置
查看>>
Vmware vSphere 6.0之安装 vCenter Server Appliance
查看>>
GlusterFS客户端进程分析
查看>>
kvm宿主机物理内存预留方案
查看>>
eclipse的products插件启动
查看>>
mysql主从复制配置篇
查看>>
关于通过vmware安装windows8的几个问题及解决--无人参与应答文件包含的产品密钥无效...
查看>>
SQL 结果缓存
查看>>
淘宝 DataX 产品说明
查看>>
NetSuite软件试用后能为企业所带来的改善和进步!
查看>>
Oracle Data Guard概念
查看>>
keepalived 中使用的命令
查看>>
201621123085 《Java程序设计》第1周学习总结
查看>>
Git的学习笔记(二)
查看>>
不会再爱
查看>>
ubuntu下安装mysql
查看>>
在jmeter测试mysql中如何一次运行多条sql语句
查看>>
RPC框架性能基本比较测试
查看>>
git安装
查看>>